See õpik on kirjutatud inimestele, kes kasutavad, mitte ei uuri, statistikat. Õpiku kasutaja peaks olema võimeline töötama R keskkonnas. Meie lähenemised statistika õpetamisele on arvutuslikud, mis tähendab, et me eelistame meetodi matemaatilise aluse asemel õpetada selle kasutamist ja tulemuste tõlgendamist. See õpik on bayesiaanlik ja ei õpeta sageduslikku statistikat. Me usume, et nii on lihtsam ja tulusam statistikat õppida ja et Bayesi statistikat kasutades saab rahuldada 99% teie tegelikest statistilistest vajadustest paremini, kui see on võimalik klassikaliste sageduslike meetoditega. Me usume ka, et kuigi praegused kiired arengud bayesi statistikas on tänaseks juba viinud selle suurel määral tavakasutajale kättesaadavasse vormi, toovad lähiaastad selles vallas veel suuri muutusi. Nende muutustega koos peab arenema ka bayesi õpetamine.

Me kasutame järgmisi R-i pakette, mis on kõik loodud bayesi mudelite rakendamise lihtsustamiseks: rethinking, brms, rstanarm, BayesianFirstAid ja bayesplot. Lisaks veel bayesboot bootstrapimiseks. Bayesi arvutusteks kasutavad need paketid Stan ja JAGS mcmc sämplereid (viimast küll ainult BayesianFirstAid paket). Selle õpiku valmimisel on kasutatud McElreathi, Kruschke ja Gelmani õpikuid (VIITED). Õpikus on ära toodud enamus kasutatud R koodist eesmärgiga, et lugeja prooviks seda koodi ise kodus jooksutada ja modifitseerida. Selline koodiga mängimine annab teile väärtuslikku intuitsooni statistika toimimise osas just selliste andmete korral, mis teie elus domineerivad.

Lugejad, kellele on juba õpetatud sageduslikku statistikat, võivad tahta teada, mille poolest see erineb bayesi statistikast. Ehkki me usume, et bayesi statistika õpetamine võrdlevalt sagedusliku statistikaga ei ole parim lahendus, võrdleme järgnevalt lühidalt sageduslikku ja bayesi paradigmasid. Kes ei ole õppinud sageduslikku statistikat, võiksid selle osa vahele jätta.

2.1. Kaks statistikat: ajaloost ja tõenäosusest

Bayesiaanlik ja sageduslik statistika leiutati üksteise järel Pierre-Simon Laplace poolt, kes arendas välja kõigepealt bayesi statistika alused ning seejärel sagedusliku statistika omad (ca. 1800 - 1812). Sagedusliku statistika tekkimise ja hilisema õitsengu põhjus 20. sajandil oli arvutuslik lihtsus. Bayesi meetoditega ei olnud võimalik korralikult teadust teha enne 1990-ndaid aastaid, mil personaalarvutite levik algatas buumi nende meetodite arendamises. Praegu on maailmas bayesi ja sageduslikku statistikat umbes pooleks (vähemalt uute meetodite arendustöö poole pealt). Eestis bayesi statistika 2017 aasta seisuga peaaegu, et puudub.

Kahe statistika põhiline erinevus ei tule matemaatikast — mõlemad harud lähtuvad samadest tõenäosusteooria aksioomidest ja nende vahel puuduvad matemaatilised lahkarvamused — vaid tõenäosuse tõlgendusest.

Bayesi tõlgenduses on tõenäosus teadlase usu määr mingi hüpoteesi kehtimisse. Hüpotees võib näiteks olla, et järgmise juulikuu sademete hulk Vilsandil jääb vahemikku 22 kuni 34 mm. Kui Bayesi arvutus annab selle hüpoteesi tõenäosuseks 0.57, siis oleme me selle teadmise najal nõus maksma mitte rohkem kui 57 senti kihlveo eest, mille alusel makstakse juhul, kui see hüpotees tõeseks osutub, välja 1 EUR (ja me saame vähemalt 43 senti kasumit).

Sageduslikud statistikud usuvad, et selline tõenäosuse tõlgendus on ebateaduslik, kuna see on “subjektiivne”. On võimalik, et n teadlast arvutavad korrektselt samade andmete põhjal n erinevat tõenäosust ja usuvad seega samade tõendite põhjal erinevaid asju. See võib juhtuda siis, kui nad lähtuvad väga erinevatest taustauskumustest oma hüpoteeside kehtimise kohta. Kui te usute, et teie taustateadmised ei tohi mingil juhul mõjutada järeldusi, mis te oma andmete põhjal teete, siis te ei ole bayesiaan. Sel juhul pakub alternatiivi sageduslik tõenäosuse tõlgendus. Sageduslik tõenäosus on defineeritud kui teatud tüüpi andmete esinemise pikaajaline suhteline sagedus. Näiteks, kui me viskame münti palju kordi, siis peaks kullide (või kirjade) suhteline sagedus meile andma selle mündi tõenäosuse langeda kiri üleval. Selline tõenäosus on omistatav ainult sellistele sündmustele, mille esinemisel on sagedus. Teaduslik teooria ei ole selline sündmus. Seega ei ole sageduslikus statistikas võimalik rääkida ka hüpoteesi kehtimise tõenäosusest. Sageduslik lahendus on selle asemel, et rääkida meie hüpoteesi tõenäosusest meie andmete korral, rääkida andmete, mis sarnanevad meie andmetega, esinemise tõenäosusest null-hüpoteesi (mis ei ole meie hüpotees) kehtimise korral. Seega omistatakse sagedus (= tõenäosus) andmetele, mitte hüpoteesile. Järgnevalt toome näite, kuidas bayesiaan ja sageduslik statistik lahendavad sama ülesande.

2.1.1. Võrdlev näide: kahe grupi võrdlus

meil on 2 gruppi, katse ja kontroll, millest kummagis 30 mõõtmist ja me soovime teada, kui palju katsetingimus mõjutab mõõtmistulemust. Meie andmed on normaaljaotusega ja andmepunktid, mida me analüüsime, on efektisuurused (katse1 - kontroll1 = es1 jne).

Bayesiaan

Statistiline küsimus on Bayesiaanil ja sageduslikul statistikul sama: kas ja kui palju erinevad kahe grupi keskväärtused? Bayesiaan alustab sellest, et ehitab kaks mudelit: andmete tõepäramudel ja taustateadmiste mudel ehk prior.

Kui andmed on normaaljaotusega, siis on ka tõepäramudel normaaljaotus. Alustame sellest, et fitime oma valimiandmed (üksikud efekti suurused) normaaljaotuse mudelisse.

Joonis 1. paariviisiline katse - kontroll disain. Katset on korratud 30 korda. X teljel on effekti suurused (ES). 30 ES-i on näidatud punktidena. Must joon näitab keskmist ES-i. Andmed on mudeldatud normaaljaotusena.

See ei ole veel tõepäramudel, sest me tahame hinnangut ES keskväärtuse kõige tõenäolisemale väärtusele, ja lisaks veel hinnangut ebakindlusele selle punkt-hinnangu ümber (usalduslpiire). Seega tuleb eelmine jaotus kitsamaks tõmmata, et ta kajastaks meie teadmisi ES-ide keskväärtuste, mitte individuaalsete ES-de, kohta. Uue jaotusmudeli sd = eelmise jaotuse sd/sqrt(30).

Joonis 2. See jaotus iseloomustab keskmise ES paiknemist puhtalt meie andmete põhjal.

Täpsemalt, selle joonise põhjal võib arvutada, milline on meie valimi keskväärtuse kohtamise tõenäosus igal võimalikul tõelisel ES-i väärtusel. Kõige tõenäolisemad on andmed siis, kui tegelik ES = andmete keskväärtusega (seda kohta näitab must joon). Kui me jagame musta joone pikkuse punase kurvi all läbi katkendjoone pikkusega sama kurvi all, saame teada, mitu korda on meie andmed tõenäolisemad siis, kui tegelik ES = mean(valimi ES), võrreldes olukorraga, kus tegelik ES = 0. Loomulikult võime sama näitaja arvutada ükskõik millise hüpoteeside paari kohta (näiteks, andmed on miljon korda tõenäolisemad hüpoteesi ES = 0.02 all kui hüpoteesi ES = -1 all; mis aga ei tähenda, et andmed oleksid väga tõenäolised kummagi võrreldud hüpoteesi all).

Aga see ei ole veel Bayes. Lisame andmemudelile taustateadmiste mudeli. Sellega tühistame me väga olulise eelduse, mis ripub veskikivina sagedusliku statistika kaelas. Nimelt, et valimi andmed peavad olema esinduslikud populatsiooni suhtes. Me võime olla üsna kindlad, et väikeste valimite korral see eeldus ei kehti ja sellega seoses ei tööta ka sageduslik statistika viisil, milleks R.A. Fisher selle kunagi lõi. Taustateadmiste mudeli roll (kuigi mitte ainus) on õrnalt suunata meie hinnangut õiges suunas vähendades halbade andmete võimet meile kahju teha. Kui sul on väike valim, siis sinu andmed vajavad sellist kantseldamist.

Olgu meie taustateadmise mudel normaaljaotus keskväärtusega 0 ja standardhälbega 1

Joonis 3. Taustateadmiste mudel e prior on must normaaljaotus, mille ülesanne on veidi vähendada ekstreemsete valimite kahjulikku mõju.

Taustateadmiste mudel on sageli normaaljaotus. Kui meil on palju taustateadmisi, siis on see jaotus kõrge ja kitsas, kui meil on vähe taustateadmisi, siis on see madal ja lai.

  Mida teha, kui sa ei taha, et taustateadmiste mudel sinu 
  posteeriori kuju mõjutab? Sellisel juhul kasutatakse nõrgalt 
  informatiivseid prioreid, mis tähendab, et priori 
  jaotus on palju laiem kui tõepäramudeli laius. Miks mitte 
  kasutada mitte-informatiivseid tasaseid prioreid? 
  Põhjused on arvutuslikud, seega tehnilist laadi.

Igal juhul järgmise sammuna korrutab bayesiaan selle jaotuse andmejaotusega, saades tulemuseks kolmanda normaaljaotuse, mille ta seejärel normaliseerib nii, et jaotuse alune pindala = 1. See kolmas jaotus on posterioorne tõenäosusjaotus, mis sisaldab kogu infot, millest saab arvutada kõige tõenäolisema katseefekti suuruse koos ebakindluse määraga selle ümber (mida rohkem andmeid, seda väiksem ebakindlus) ja tõenäosused, et tegelik katseefekt jääb ükskõik milllisesse meid huvitavasse vahemikku.

Nüüd ei ole siis muud kui bayesi mudel läbi arvutada.

Joonis 4. Triplot. Bayesi väljund on posterioorne tõenäosusjaotus (roheline). Nagu näha, ei ole selle jaotuse tipp täpselt samas kohas kui andmejaotuse tipp ehk keskväärtus. Prior tõmbab seda veidi nulli suunas. Lisaks on posteerior veidi kitsam kui andmemudel, mis tähendab, et hinnang ES-le tuleb väiksema ebakindluse määraga.

Posteerior sisaldab endas kogu infot, mis meil ES-i tõelise väärtuse kohta on. Siit saame arvutada

  1. parima hinnangu ES-i punktväärtusele,

  2. usaldusintervalli, ehk millisest ES-ide vahemikust loodame leida tõelise ES-i näit 90% tõenäosusega,

  3. iga mõeldava ES-i väärtuste vahemiku kohta tõenäosuse, millega tõeline ES jääb sellesse vahemikku.

  4. saame ES-i põhjal arvutada mõne muu statistiku, näiteks ES1 = log(ES), kasutades selleks ES-i posterioorset jaotust. Sel viisil kanname oma ES-i hinnangus peituva ebakindluse üle ES1-le, millele saame samuti rakendada punkte 1-3 (sest ES1 on posterioorne jaotus).

  5. uute andmete lisandumisel saame kasutada ES-i posteeriorit uue priorina ja arvutada uue täiendatud posteeriori. Põhimõtteliselt võime seda teha pärast iga üksiku andmepunkti lisandumist. See avab ka head võimalused metaanalüüsiks.

  6. lisaks saame oma algsest mudelist ka posteeriori andmepunkti tasemel varieeruvusele (pole näidatud). Seda kasutame uute andmete simuleerimiseks (meie näites üksikud ES-d).

Sageduslik statistik

Sageduslik lähenemine sisaldab ainult ühte mudelit, mida võrreldakse valimi andmetega. Sageduslik statistik alustab selles lihtsas näites täpselt samamoodi nagu bayesiaan, tekitades eelmisega identse andmemudeli, mis on keskendatud valimi keskväärtusele (Joonis 2). Seejärel nihutab ta oma andmemudelit niipalju, et normaaljaotuse tipp ei ole enam valimi keskväärtuse kohal vaid hoopis 0-efekti kohal. Jaotuse laius nihutamisel ei muutu.

Seda nullile tsentreeritud mudelit kutsutakse null-hüpoteesiks (H0). Nüüd võrdleb ta oma valimi keskväärtust (must joon) H0 jaotusega. Kui valimi keskväärtuse kohal on H0 jaotus kõrge, siis on andmete tõenäosus H0 kehtimise korral suur. Ja vastupidi, kui valimi keskväärtuse kohal on H0 madal, siis on andmete esinemise tõenäosus H0 all madal. Seda tõenäosust kutsutakse p väärtuseks. Mida väiksem on p, seda vähem tõenäolised on teie andmed juhul, kui H0 on tõene ja katseefekt võrdub nulliga. P on defineeritud kui “teie andmete või 0-st veel kaugemal asuvate andmete esinemise pikaajaline suhteline sagedus tingimusel, et H0 kehtib”.

tulemuste tõlgendamine

Kui sageduslik statistik kirjutab, et tema “efekti suurus on statistiliselt oluline 0.05 olulisusnivool”, siis ta ütleb sellega, et tema poolt arvutatud p < 0.05. Selle väite korrektne tõlgendus on, et juhul kui statistik pika aja jooksul võtab omaks “statistiliselt olulistena” kõik tulemused, millega kaasnev p < 0.05 ja lükkab tagasi kõik tulemused, mille p > 0.05, siis sooritab ta 5% sagedusega tüüp 1 vigu. See tähendab, et igast sajast tõesest H0-st, mida ta testib, võtab ta keskeltläbi 5 vastu, kui statistiliselt olulised. Sageduslik statistika on parim viis tüüp 1 vigade sageduse pikaajaliseks fikseerimiseks. Paraku ei tea me ühegi üksiku testi kohta ette, kas see testib kehtivat või mittekehtivat H0-i, mis teeb raskeks katseseeriate ühekaupa tõlgendamise. Tuletame meelde, et sageduslikus statistikas ei saa rääkida H0 kehtimise tõenäosusest vaid peab rääkima andmete tõenäosusest (ehk andmete esinemise sagedusest) tingimusel, et H0 kehtib.

Kas ühte p väärtust saab tõlgendada kui hinnangut tõendusmaterjali hulgale, mida teie valim pakub H0 vastu? Selle üle on vaieldud juba üle 80 aasta, kuid tundub, et ainus viis seda kas või umbkaudu teha on bayesiaanlik. Igal juhul, p väärtust, mis on defineeritud pikaajalise sagedusena, on raske rakendada üksiksündmusele. Bayesiaanliku p väärtuste tõlgendamiskalkulaatori leiate aadressilt http://www.graphpad.com/quickcalcs/interpretPValue1/

Kujutle mass spektroskoopia katset, kus mõõdame 2000 valgu 
tasemeid katse-kontroll skeemis ja katset korratakse n korda. 
Sageduslik statistik kasutab adjusteeritud p väärtusi või q 
väärtusi, et tõmmata piir, millest ühele poole jäävad statistiliselt 
olulised ES-d ja teisele poole mitteolulised null-efektid. Edasi 
tõlgendab ta mitteolulisi efekte kui ebaolulisi ja diskuteerib vaid 
"olulisi" efekte. Paraku, p väärtuste arvutamine ja adjusteerimine 
saab toimuda mitmel erineval moel ja usalduspiiri panekule just 95-le 
protsendile, mitte näiteks 89% või 99.2%-le, pole ühtegi ratsionaalset 
põhjendust. Seega tõmbab ta sisuliselt juhuslikus kohas joone läbi 
efektide, misjärel ignoreerib kõiki sellest joonest valele poole jäänud 
efekte. Meetod, mis väga hästi töötab pikaajalises kvaliteedikontrollis, 
ei ole kahjuks kuigi mõistlik katse tulemuste ükshaaval tõlgendamises. 
Mis juhtub, kui oleme kavalad ja proovime mitmeid erinevaid p 
väärtustega töötamise meetodeid, et valida välja see usalduspiir, 
millest õigele poole jäävaid andmeid on teaduslikult kõige parem 
tõlgendada? Ehkki ükshaaval võisid kõik meie poolt läbi arvutatud 
meetodid olla lubatud (ja isegi võrdselt head), ei fikseeri p nüüd enam 
tüüp 1 vigade sagedust. See tähendab, et p on kaotanud definitsioonijärgse 
tähenduse ja te oleksite võinud olulisuspiiri sama hästi tõmmata tunde järgi.

tüüpiline tulemuse kirjeldus artiklis:

  1. sageduslik: the effect is statistically significant (p < 0.01).

  2. bayesiaanlik: the most likely effect size is q1 (90% CI = q2, q3) and the probability that the true effect is < 0 is q4 percent.

90% CI — credible interval — tähendab, et me oleme 90% kindlad, et tegelik efekti suurus asub vahemikus q2 … q3.

2.1.2.kahe paradigma erinevused

  1. sageduslikus statistikas võrdub punkt-hinnang tegelikule efekti suurusele valimi keskmise ES-ga. Bayesi statistikas see sageli nii ei ole, sest taustateadmiste mudel mõjutab seda hinnangut. Paljud mudelid püüavad ekstreemseid valimeid taustateadmiste abil veidi mõistlikus suunas nihutada, niiviisi vähendades ülepaisutatud efektide avaldamise ohtu.

  2. sageduslik statistika töötab tänu sellele, et uurija võtab vastu pluss-miinus otsuseid: iga H0 kas lükatakse ümber või jäetakse kehtima. Seevastu bayesiaan mõtleb halli varjundites: sissetulevad andmed kas suurendavad või vähendavad hüpoteeside tõenäosusi (mis jäävad aga alati > 0 ja < 1).

  3. p väärtused kontrollivad tüüp 1 vigade sagedust ainult siis, kui katse disaini ja hilisema tulemuste analüüsi detailid on enne katse sooritamist jäigalt fikseeritud (või eelnevalt on täpselt paika pandud lubatud variatsioonid katse- ja analüüsi protokollis). Eelkõige tähendab see, et valimi suurus ja kasutatavad statistilinsed testid peavad olema eelnevalt fikseeritud. Tüüpiliselt saame p väärtuse arvutada vaid üks kord ja kui p = 0.051, siis oleme sunnitud H0 paika jätma ning efekti deklareerimisest loobuma. Me ei saa lihtsalt katset juurde teha, et vaadata, mis juhtub. Bayesiaan seevastu võib oma posterioorse tõenäosuse arvutada kasvõi pärast iga katsepunkti kogumist ning katse peatada kohe (või alles siis), kui ta leiab, et tema posterioorne jaotus on piisavalt kitsas, et teaduslikku huvi pakkuda.

  4. sagedusliku statistika pluss-miinus iseloom tingib selle, et kui tegelik efekti suurus on liiga väike, et sattuda õigele poole olulisusnivood, siis annavad statistiliselt olulisi tulemusi ülepaisutatud efektid, mida tekib tänu valimiveale. Nii saab süstemaatiliselt kallutatud teaduse. Bayesi statistikas seda probleemi ei esine, kuna otsused ei ole pluss-miinus tüüpi.

  5. bayesi statistika ei fikseeri tüüp 1 vigade sagedust. See-eest võitleb see nn valehäirete vastu, milleks kaasajal kasutatakse enim hierarhilisi shrinkage mudeleid. See on bayesi vaste sageduslikus statistikas kasutatavatele multiple testingu korrektsioonidele. Kui sageduslik statistik võitleb valehäiretega p väärtusi adjusteerides ja selle läbi olulisusnivood nihutades, siis bayesiaan kasutab shrinkage mudelit, et parandada hinnanguid üksikute efektide keskväärtustele ja nende sd-le, kasutades paindlikult kogu andmesetis leiduvat infot.

See on kõik, mida me sagedusliku statistika kohta ütleme. Mitte miski, mis järgneb, ei eelda sagedusliku paradigma tundmist.

2.2 Suur ja väike maailm

Andmeanalüüs ja statistika (siin sünonüümid) on lahutamatu osa igast loodusteadusest. Järgnevalt seletan, miks.

Kuna maailm on liiga suur ja keeruline, et seda otse uurida, lõikavad teadlased selle väiksemateks tükkideks, kasutades tordilabidana teaduslike hüpoteese. Tüüpiline hüpotees pakub välja mittematemaatilise seletuse mõnele kitsalt piiritletud loodusnähtusele. Näiteks darvinistlik evolutsiooniteooria püüab seletada evolutsiooni toimemehhanisme. Seda teooriat võib võrrelda empiiriliste andmetega.

Mis juhtub, kui teie lemmikhüpotees on andmetega kooskõlas? Kas see tähendab, et see hüpotees on tõene? Või, et see on tõenäoliselt tõene? Kahjuks on vastus mõlemale küsimusele eitav. Põhjuseks on asjaolu, et enamasti leiab iga nähtuse seletamiseks rohkem kui ühe alternatiivse teadusliku hüpoteesi (näit. lamarksistlik evolutsiooniteooria) ning rohkem kui üks üksteist välistav hüpotees võib olla olemasolevate andmetega võrdses kooskõlas. Asja teeb veel hullemaks, et teoreetiliselt on võimalik sõnastada lõpmatult palju erinevaid teooriaid, mis kõik pakuvad alternatiivseid ja üksteist välistavaid seletusi samale nähtusele.

Olgu peale, kui me vaatame maailma kõiketeadja jumala perspektiivist, siis tema võib vaadelda kõikehõlmava tõendusmaterjali sobivust kõigi võimalike teooriatega ning valida välja selle ainsa teooria, mis kõige paremini tõendusmaterjaliga sobib. Kuigi, see eeldaks, et tal on lõpmata palju andmeid, sest muidu ei oleks tal loogiliselt võimalik lõpmata paljude teooriate vahel valida - aga jumala jaoks on kõik võimalik. Igal juhul meie, surelike, jaoks tähendab see, et teaduslikus “faktis” saab alati kahelda, sest kunagi ei või kindel olla, et parimad teooriad lõpmata suurest teooriapilvest ei ole meil täiesti tähelepanuta jäänud ning, et meie jaoks eksisteerivad andmed kajastaksid hästi kõiki võimalikke andmeid. On selge nagu seebivesi, et mida vähem aega me kulutame teoorialoomeks ja andmete kogumiseks, seda vähem usutavad on ka meie teaduslikud järeldused. Sageli on nii, et mida kehvem on olukord andmerindel, seda rohkem vajame statistikat. Kui meil õnnestuks oma andmetest ilma statistikata saia teha, ei kõhkleks me hetkegi! Eriti, kuna statistikaga käivad käsikäes statistilised mudelid.

2.2.1 Mudeli väike maailm

Ülalmainitud teadusliku meetodi puudused tingivad, et meie huvides on oma teaduslikke probleeme veel ühe taseme võrra lihtsustada, taandades need statistilisteks probleemideks. Selleks tuletame me tavakeelsest ja laiahaardelisest teaduslikust teooriast täpselt formuleeritud matemaatilise mudeli ning seejärel asume uurima oma mudelit.

Mudeli maailm erineb päris maailmast selle poolest, et mudeli maailmas on kõikvõimalikud sündmused, mis põhimõtteliselt võivad juhtuda, juba ette teada ja üles loetud (seda sündmuste kogu kutsutakse parameetriruumiks). Seega, tehniliselt on mudeli maailmas üllatused võimatud.

Mudeli eeliseks teooria ees on, et hästi konstrueeritud mudel on lihtsamini mõistetav — erinevalt vähegi keerulisemast teaduslikust hüpoteesist on mudeli eeldused ja ennustused läbinähtavad ja täpselt formuleeritavad. Mudeli puuduseks on aga, et erinevalt teooriast ei ole mingit võimalust, et mudel vastaks tegelikkusele ehk oleks tõene. Seda sellepärast, et mudel on taotluslikult lihtsustav (erandiks on puhtalt ennustuslikud mudelid, mis on aga enamasti läbinähtamatu struktuuriga). Mudel on kas kasulik või kasutu; teooria on kas tõene või väär. Mudeli ja maailma vahel võib olla kaudne “peegeldus”, aga mitte kunagi otsene side. Seega, ükski number, mis arvutatakse mudeli raames, ei kandu sama numbrina üle teaduslikku ega päris maailma. Ja kogu statistika (ka mitteparameetriline) toimub mudeli väikses maailmas. Arvud, mida statistika teile pakub, elavad mudeli maailmas; samas kui teie teaduslik huvi on suunatud päris maailmale. Näiteks 95% usaldusintervall ei tähenda, et te peaksite olema 95% kindel, et tõde asub selles intervallis – sageli ei tohiks te seda nii julgelt tõlgendada isegi kitsas mudeli maailmas.

2.2.2. Näide: Aristoteles, Ptolemaios ja Kopernikus

Aristoteles lõi teooria maailma toimimise kohta, mis domineeris haritud Eurooplase maailmapilti enam kui 1200 aasta vältel. Selle kohaselt asub universumi keskpunktis maakera ning kõik, mida siin leida võib, on tehtud neljast elemendist: maa, vesi, õhk ja tuli. Samas, kogu maailmaruum alates kuu sfäärist on tehtud viiendast elemendist (eeter), mida aga ei leidu maal (nagu nelja elementi ei leidu kuu peal ja sealt edasi). Taevakehad (kuu, päike, planeedid ja kinnistähed) tiirlevad ümber maa kontsentrilistes sfäärides, mis on omavahel seotud (mille vahel pole vaba ruumi). Seega on kogu liikumine eetri sfäärides ühtlane ja ringikujuline ja see liikumine põhjustab pika põhjus-tagajärg ahela kaudu kõiki liikumisi, mida maapeal kohtame. Kaasa arvatud meie sündimine, elukäik ja surm (mis on kõik liikumised). Kõik, mis maapeal huvitavat, ehk kogu liikumine, on algselt põhjustatud esimese liikumise poolt, mille käivitab kõige välimises sfääris paiknev meie jaoks mõistetamatu intellektiga “olend”.

Aristotelese suur teooria ühendab kogu maailmapildi alates kaasaegses mõistes keemiast ja kosmoloogiast kuni bioloogia, maateaduse ja isegi geograafiani. Sellised ühendteooriad on nagu 500 aastased sekvoiad; nad on rasked langetada, aga kui mõni siiski kukub, kostab ragin kaugele. Samas, ühte Aristotelese kosmoloogia olulist puudust nähti kohe. Nimelt ei suuda Aristoteles seletada, miks osad planeedid teavavõlvil vahest suunda muudavad ja mõnda aega lausa vastupidises suunas liiguvad (retrogressioon). Kuna astronoomia põhiline kasutusala oli astroloogia, siis põõrati planeetide liikumisele suurt tähelepanu. Lahenduseks ei olnud aga mitte suure teooria ümbertegemine või ümberlükkamine, vaid nõudlus uue teaduse järele, mis “päästaks fenomenid”. Siin tuli appi Ptolemaios, kes lõi matemaatilise mudeli, kus planeedid mitte lihtsalt ei liigu ringtrajektoori mõõda vaid samal ajal teevad ka väiksemaid ringe ümber esimese suure ringjoone. Neid väiksemaid ringe kutsutakse epitsükliteks. See mudel suutis planeetide liikumist taevavõlvil piisavalt hästi ennustada, et astroloogide nõudlik seltskond sellega rahule jäi.

Ptolemaiosel ja tema järgijatel oli tegelikult mitu erinevat mudelit. Osad neist ei sialdanud epitsükleid ja maakera ei asunud tema mudelites universumi keskel, vaid oli sellest punktist eemale nihutatud — nii et päike ei teinud ringe ümber maakera vaid ümber tühja punkti. On oluline, et leidus epitsüklitega mudel ja ilma epitsükliteta mudel, mis olid matemaatiliselt ekvivalentsed ja seega andsid võrdseid ennustusi. Oli selge, et Aristotelese teooria ja fenomenide päästmise mudelid olid fundamentaalselt erinevad asjad. Samal ajal kui Aritoteles seletas maailma põhiolemust põhjuslike seoste jadana (mitte matemaatiliselt), kirjeldas/ennustas Ptolemaios sellesama maailma käitumist matemaatiliste (mitte põhjuslike) struktuuride abil.

Nii tekkis olukord, kus maailma mõistmiseks kasutati 1000 aasta vältel Aristotelese ühendteooriat aga selle kirjeldamiseks ja tuleviku ennustamiseks hoopis ptolemailisi mudeleid, mida keegi päriselt tõeks ei pidanud ja mida hinnati selle järgi, kui hästi need “päästsid fenomene”.

See toob meid Koperniku juurde, kes teadusajaloolaste arvates vallandas 17. sajandi teadusliku revolutsiooni avaldades raamatu, kus ta asetab päikese universumi keskele ja paneb maa selle ümber ringtrajektooril tiirlema. Kas Kopernikus tõrjus sellega kõrvale Aristotelese, Ptolemaiose või mõlemad? Kaasaegne seisukoht on, et kuigi Kopernikus soovis teha kolmandat, arvasid tema rängalt matemaatilise teose avaldamisele järgnenud 40 aasta vältel pea kõik asjatundlikud astronoomid, et ta soovis välja pakkuda vaid lihtsama alternatiivi epitsüklitega mudelile, mis selleks ajaks oli muutunud väga keerukaks (aga ka samavõrra ennustustäpseks). Kuna Kopernikuse raamat läks trükki ajal, mil selle autor oli juba surivoodil, kirjutas sellele eessõna üks tema vaimulikust sõber, kes püüdis oodatavat kiriklikku pahameelt leevendada sugereerides, et päikese keskele viimine ei ole muud kui mudeldamise trikk, millest ei tasu järeldada, et maakera ka tegelikult ümber päikese tiirleb (piibel räägib, kuidas jumal peatas taevavõlvil päikese, mitte maa). Ja kuna eessõna oli anonüümne, eeldasid lugejad muidugi, et selle kirjutas autor. Lisaks, kuigi Kopernikus tõstis päikese keskele, jäi ta ringikujuliste trajektooride juurde, mis tähendas, et selleks, et tema mudel fenomenide päästmisel hätta ei jääks ja astroloogidele kasutu ei oleks, oli ta sunnitud maad ja planeete liigutama ümber päikese mõõda epitsükleid. Kokkuvõttes oli Koperniku mudel sama keeruline kui Ptolemaiose standardmudel (neis oli võrdne arv epitsükleid) ja selle abil tehtud ennustused planeetide liikumise kohta olid väiksema täpsusega.

  Koperniku mudel suutis samas ennustada mõningaid nähtusi (planeetide näiv
  heledus muutub ning jõuab maksimumi nende lähimas asukohas maale), mida
  Ptolemaiose mudel ei ennustanud. See ei tähenda, et need fenomenid oleksid
  olnud vastuolus Ptolemaiose mudeliga. Lihtsalt, nende Ptolemaiose mudelisse
  sobitamiseks oli vaja osad mudeli parameetrid fikseerida nii-öelda suvalistele väärtustele. 
  Seega Koperniku mudel töötas nii, nagu see oli, samas kui Ptolemaiose mudel vajas ad hoc tuunimimst.  

Kui vaadata Koperniku produkti teooriana, mitte mudelina, siis oli sel selgeid eeliseid Aristotelese ees. Juba ammu oli nähtud komeete üle taevavõlvi lendamas (mis Aristotelese järgi asusid kinnistähtede muutumatus sfääris) ja supernoova tekkimist ja kadu, ning enam ei olnud kaugel ka aeg mil Galileo joonistas oma teleskoobist kraatreid kuu pinnal, näidates, et kuu ei saanud koosneda täiuslikust viiendast elemendist ja et sellel toimusid ilmselt sarnased füüsikalised protsessid kui maal. On usutav, et kui Kopernikus oleks jõudnud oma raamatule ise essõna kirjutada, oleks tema teooria vastuvõtt olnud palju kiirem (ja valulisem). Seega, teooria ja mudeli eristus on tähtis!

  Koperniku teooriast tuleneb loogilise paratamatusena, et tähtedel esineb
  maalt vaadates parallaks. See tähendab, et kui maakera koos astronoomiga
  teeb poolringi ümber päikese, siis kinnistähe näiv asukoht taevavõlvil
  muutub, sest astronoom vaatleb teda teise nurga alt. Pange oma nimetissõrm
  näost u 10 cm kaugusele, sulgege parem silm, seejärel avage see ning sulgege
  vasak silm ja te näete oma sõrme parallaksi selle näiva asukoha muutusena.
  Tähtede parallaksi püüti mõõta juba Aleksandrias >1000 aastat enne Kopernikut, 
  et leida kinnitust teooriale, mille kohaselt maakera tiirleb ümber päikese. 
  Mõõtmised ei näidanud aga parallaksi olemasolu (sest maa trajektoori diameeter 
  on palju lühem kui maa kaugus tähtedest). Parallaks mõõdeti edukalt alles 1838, 
  siis kui juba ammu iga koolijüts uskus, et maakera tiirleb ümber päikese!
  
  

2.3. Millest koosneb mudel?

Mudel on matemaatilise formalism, mis püüab kirjeldada füüsikalist protsessi. mudeli struktuuris on komponent, mis kirjeldab ideaalseid ennustusi ja eraldi veakomponent, mis kirjeldab kuidas andmepunktid varieeruvad selle ideaalse ennustuse ümber. Mudeli koostisosad on (i) muutuja, mille väärtusi ennustatkse (dependent variable), (ii), muutuja(d), mille väärtuste põhjal ennustatakse (independent variables), (iii) parameetrid, mille väärtused fititakse ii põhjal ja (iv) konstandid.

Oletame, et me mõõtsime N inimese pikkuse cm-s ja kaalu kg-s ning meid huvitab, kuidas inimeste pikkus sõltub nende kaalust. Lihtsaim mudel pikkuse sõltuvusest kaalust on pikkus = kaal (formaliseeritult: y = x) ja see mudel ennustab, et kui Johni kaal = 80 kg, siis John on 80 cm pikkune. siin on pikkus (i) muutuja, mille väärtust ennustatakse ja kaal (ii) muutuja, mille väärtuste põhjal ennustatakse. Mudeli komponendid (iii) ja (iv) puuduvad. Selle mudeli saame graafiliselt kujutada nii:

x <- 50:200 #y = kaal
y <- x # x = pikkus 
plot(y~x, type="l", xlab="weight in kg", ylab="heigth in cm", main="fixed linear model")

Nüüd painutame seda sirget. See joon on ikka veel täielikult fikseeritud, aga ta pole enam sirge (ehkki tehniliselt on meil ikka lineaarne seos x ja y vahel).

x <- 50:200
y <- x + x**2
plot(y~x, type="l")

Mudeli keeles tähistame me seda, mida me ennustame (antud juhul pikkus) Y-ga ja seda, mille väärtuse põhjal me ennustame (antud juhul kaal) X-ga. Seega sirge mudeli matemaatiline formalism on Y = X. See on äärmiselt jäik mudel: ta on sirge kujuline ja selle sirge asukoht on rangelt fikseeritud. Sirge lõikab y telge alati 0-s (mudeli keeles: sirge intercept ehk lõikepunkt Y teljel = 0) ja tema tõusunurk saab olla ainult 45 kraadi (mudeli keeles: mudeli slope ehk tõus = 1). Selle mudeli jäikus tuleneb sellest, et temas ei ole parameetreid, mille väärtusi me saaksime muuta ehk tuunida.

Kuidas aga kirjeldada sirget, mis võib paikneda 2-mõõtmelises ruumis ükskõik millises asendis? Selleks lisame mudelisse kaks parameetrit, intercept (a) ja tõus (b). Kui a = 0 ja b = 1, saame me eelpool kirjeldatud mudeli y = x. Kui a = 102, siis sirge lõikab y telge väärtusel 102. Kui b = 0.8, siis x-i tõustes 1 ühiku võrra tõuseb y-i väärtus 0.8 ühiku võrra. Kui a = 100 ja b = 0, siis saame sirge, mis on paraleelne x-teljega ja lõikab y telge väärtusel 100. Seega, Teades a ja b väärtusi ning omistades x-le suvalise meid huvitava väärtuse, saab ennustada y-i keskmist väärtust. Näiteks, olgu andmete vastu fititud mudel:

pikkus(cm) = 102 + 0.8 * kaal(kg) ehk

y = 102 + 0.8x.

Omistades nüüd kaalule väärtuse 80 kg, tuleb mudeli poolt ennustatud keskmine pikkus 102 + 0.8 * 80 = 166 cm. Iga kg lisakaalu ennustab mudeli kohaselt 0.8 cm võrra suuremat pikkust.

a <- 102
b <- 0.8
x <-  0:100 
y <-  a + b * x
plot(y~x, type="l", xlab="weight in kg", ylab="heigth in cm", main="a more flexible linear model", ylim=c(50, 200))

See mudel ennustab, et 0 kaalu juures on pikku 102 cm, mis on rumal, aga mudelite puhul tavaline, olukord. Me tuunime mudelit andmete peal, mis ei sisalda 0-kaalu. Meie valimiandmed ei peegelda täpselt inimpopulatsiooni. Sirge mudel ei peegelda täpselt pikkuse-kaalu suhteid vahemikus, kus meil on reaalseid kaaluandmeid; ja ta teeb seda veelgi vähem seal, kus meil mõõdetud kaalusid ei ole. Seega pole mõtet imestada, miks mudeli intercept meie üle irvitab.

Neli mõistet

X ja Y on muutujad, a ja b on parameetrid. Muutujate väärtused fikseeritakse andmete poolt, parameetrid fititakse andmete põhjal. Fititud mudel ennustab igale X-i väärtusele vastava kõige tõenäolisema Y väärtuse (Y keskväärtuse sellel X-i väärtusel).

Y - mida me ennustame (dependent variable, predicted varable)

X - mille põhjal me ennustame (independent variable, predictor)

muutuja (variable) - iga asi, mida me valimis mõõdame (X ja Y on kaks muutujat). Muutuja väärtused on fikseeritud andmete poolt. Muutujal on sama palju fikseeritud väärtusi kui meil on selle muutuja kohta mõõtmisandmeid.

parameeter (parameter) - mudeli koefitsient, millele võib omistada suvalisi väärtusi. Parameetreid tuunides fitime mudeli võimalikult hästi sobituma andmetega.

2.4. Mudeli fittimine

Mudelid sisaldavad (1) matemaatilisi struktuure, mis määravad mudeli tüübi ning (2) parameetreid, mida saab andmete põhjal tuunida, niiviisi täpsustades mudeli kuju.

Seda tuunimist nimetatakse mudeli fittimiseks. Mudelit fittides on eesmärk saavutada antud tüüpi mudeli maksimaalne sobivus andmetega. Näiteks võrrand y = a + bx määrab mudeli, kus y = x on on see struktuur, mis tagab, et mudeli tüüp on sirge, ning a ja b on parameetrid, mis määravad sirge asendi. Seevastu struktuur y = x + x^2 tagab, et mudeli y = a + b1x + b2x^2 tüüp on parabool, ning parameetrite a, b1 ja b2 väärtused määravad selle parabooli täpse kuju. Ja nii edasi.

lineraarse mudeli maksimaalse sobivuse andmetega saab tagada kahel erineval viisil: 
(i) vähimruutude meetod arvutab iga andmepunkti kauguse mudeli ennustusest võtab 
selle kauguse ruutu, summeerib tulemused ja leiab sirge asendi, kus see summa 
on minimaalne; 
(ii) Bayesi teoreem annab väheinformatiivse priori korral praktiliselt sama fiti. 

Hea mudel on

  1. võimalikult lihtsa struktuuriga, mille põhjal on veel võimalik teha järeldusi protsessi kohta, mis genereeris mudeli fittimiseks kasutatud andmeid;

  2. sobitub piisavalt hästi andmetega (eriti uute andmetega, mida ei kasutatud selle mudeli fittimiseks), et olla relevantne andmeid genereeriva protsessi kirjeldus;

  3. genereerib usutavaid simuleeritud andmeid (see näitab mudeli kvaliteeti).

Sageli fititkse samade andmetega mitu erinevat tüüpi mudelit ja püütakse otsustada, milline neist vastab kõige paremini eeltoodud tingimustele. Näiteks, kui sirge suudab kaalu järgi pikkust ennustada paremini kui parabool, siis on sirge mudel paremas kooskõlas teadusliku hüpoteesiga, mis annaks mehhanismi protsessile, mille käigus kilode lisandumine viiks laias kaaluvahemikus inimeste pikkuse kasvule ilma, et pikkuse kasvu tempo kaalu tõustes langeks.

See, et teie andmed sobivad hästi mingi mudeliga, ei tähenda automaatselt, et see fakt oleks teaduslikult huvitav. Mudeli parameetrid on mõtekad mudeli matemaatilise kirjelduse kontekstis, aga mitte tingimata suure maailma põhjusliku seletamise kontekstis. Siiski, kui mudeli matemaatiline struktuur loodi andmeid genreeeriva loodusliku protsessi olemust silmas pidades, võib mudeli koefitsientide uurimisest selguda olulisi tõsiasju suure maailma kohta.

Üle- ja alafittimine

Osad mudelite tüübid on vähem paindlikud kui teised (parameetreid tuunides on neil vähem liikumisruumi). Kuigi sellised mudelid sobituvad halvemini andmetega, võivad need ikkagi paremini kui mõni paindlikum mudel välja tuua andmete peidetud olemuse. Mudeldamine eeldab, et me usume, et meie andmetes leidub nii müra (mida mudel võiks ignoreerida), kui signaal (mida mudel püüab tabada). Kuna mudeli jaoks näeb müra samamoodi välja, kui signaal, on iga mudel kompromiss üle- ja alafittimise vahel. Me lihtsalt loodame, et meie mudel on piisavalt jäik, et mitte liiga palju müra modelleerida ja samas piisavalt paindlik, et piisaval määral signaali tabada.

Üks kõige jäigemaid mudeleid on sirge, mis tähendab, et sirge mudel on suure tõenäosusega alafittitud. Keera sirget kuipalju tahad, ikka ei sobitu ta enamiku andmekogudega. Ja need vähesed andmekogud, mis sirge mudeliga sobivad, on genereeritud teatud tüüpi lineaarsete protsesside poolt. Sirge on seega üks kõige paremini tõlgendatavaid mudeleid. Teises äärmuses on polünoomsed mudelid, mis on väga paindlikud, mida on väga raske tõlgendada ja mille puhul esineb suur mudeli ülefittimise oht. Ülefititud mudel järgib nii täpselt valimiandmeid, et sobitub hästi valimis leiduva juhusliku müraga ning seetõttu sobitub halvasti järgmise valimiga samast populatsioonist (igal valimil on oma juhuslik müra). Üldiselt, mida rohkem on mudelis tuunitavaid parameetreid, seda paindlikum on mudel, seda kergem on seda valimiandmetega sobitada ja seda raskem on seda tõlgendada. Veelgi enam, alati on võimalik konstrueerida mudel, mis sobitub täiuslikult kõikide andmepunktidega (selle mudeli parameetrite arv = N). Selline mudel on täpselt sama informatiivne kui andmed, mille põhjal see fititi — ja täiesti kasutu.

Joonis: Kasvava paindlikusega polünoomsed mudelid. mod_e1 on sirge võrrand y = a + b1x (2 parameetrit: a ja b1), mod_e2 on lihtsaim võimalik polünoom: y= a + b1x + b2x^2 (3 parameetrit), …, mod_e5: y= a + b1x + b2x^2 + b3x^3 + b4x^4 + b5x^5 (6 parameetrit). mod_e5 vastab täpselt andmepunktidele (N = 6).

Vähemruutude meetodil fititud mudeleid saame võrrelda AIC-i näitaja järgi. AIC - Akaike Informatsiooni Kriteerium - vaatab mudeli sobivust andmetega ja mudeli parameetrite arvu. Väikseim AIC tähitab parimat fitti väikseima parameetrite arvu juures (kompromissi) ja väikseima AIC-ga mudel on eelistatuim mudel. Aga seda ainult võrreldud mudelite hulgas. AIC-i absoluutväärtus ei loe - see on suhteline näitaja.

AIC(mod_e1, mod_e2, mod_e3, mod_e4, mod_e5)

AIC näitab, et parim mudel on mod_e4. Aga kas see on ka kõige kasulikum mudel? Mis siis, kui 3-s andmepunkt on andmesisestaja näpuviga?

Joonis: sedamööda kuidas parameetrite arv mudelis kasvab, kasvab ka R ruut. R ruut 0.8 tähendab, et x-i varieeruvus suudab seletada kuni 80% y-i varieeruvusest. Lisaparameetri lisamine ei saa põhimõtteliselt R ruutu vähendada. Aga selle kasvu kiirus on aeglustuv. Ühel hetkel ei õigusta mudeli fiti paranemine enam mudeli paindlikuse kasvu (mis mõlemad saavutatakse parameetreid lisades).

Ülefittimise vältimiseks kasutavad Bayesi mudelid informatiivseid prioreid, 
mis välistavad ekstreemsed parameetriväärtused. 
Vt http://elevanth.org/blog/2017/08/22/there-is-always-prior-information/ 

2.5. Veamudel

Eelpool kirjeldatud mudelid on deterministlikud — nad ei sisalda hinnangut andmete varieeruvusele ennustuse ümber. Neid kutsutakse ka protsessi mudeliteks sest nad modelleerivad protsessi täpselt. Ehk kui mudel ennustab, et 80 kg inimene on 166 cm pikkune, siis protsessi mudel ei ütle, kui suurt kaalust sõltumatut pikkuste varieeruvust võime oodata 80 kg-ste inimeste hulgas? Selle hinnangu andmiseks tuleb mudelile lisada veel üks komponent, veamudel ehk veakomponent, mis sageli tuuakse sisse normaaljaotuse kujul. Veakomponent modelleerib üksikute inimeste pikkuste varieeruvust (mitte keskmise pikkuse varieeruvust) igal mõeldaval ja mittemõeldaval kaalul. Tänu sellele ei ole mudeli ennustused enam deterministlikud, vaid tõenäosuslikud.

Bioloogid, erinevalt füüsikutest, usuvad, et valimisisene andmete varieeruvus on
pigem tingitud bioloogilisest varieeruvusest kui mõõtmisveast. Aga loomulikult on
seal olemas ka mõõtmisviga. Lihtsuse ja ajaloolise järjepidevuse huvides räägime
järgnevalt veamudelist, mitte "bioloogilise varieeruvuse ja veamudelist".

Kuidas veakomponent lineaarsesse mudelisse sisse tuua?

ilma veakomponendita mudel: y = a + bx

Veakomponent tähendab, et y-i väärtus varieerub ümber mudeli poolt ennustatud keskväärtuse ja seda varieeruvust normaaljaotusega modelleerides saame

y ~ dnorm(mu, sigma)

kus mu on mudeli poolt ennustatud keskväärtus ja sigma on mudeli poolt ennustatud standardhälve ehk varieeruvus andmepunktide tasemel. Tilde ~ tähistab seose tõenäosuslikkust.

Sirge mudelisse varieeruvuse sisse toomiseks defineerime mu ümber nõnda:

mu = a + bx, mis tähendab, et

y ~ dnorm(a + bx, sigma)

See ongi sirge mudel koos veakomponendiga. Seega on sellel lineaarsel regressioonimudelil kolm parameetrit: intercept a, tõus b ja “veaparameeter” sigma. Sellist mudelit on mõistlikum fittida Bayesi teoreemi abil, kui vähimruutude meetodil. Bayesi meetodiga fititud mudel, mida kutsutakse posteerioriks, näitab, millised kombinatsioonid nendest kolmest parameetrist usutavalt koos esinevad (ja millised mitte). Seega on fititud 3 parameetriga bayesi mudel 3-dimensionaalne tõenäosusjaotus (3D posteerior). Muidugi saame ka ükshaaval välja plottida kolm 1D posteeriori, millest igaüks iseloomustab üht parameetrit ning on kollapseeritud üle kahe ülejäänud parameetri. 4. peatükis õpime selliste mudelitega töötama.

Kõik statistilised mudelid on tõenäosusmudelid ning sisaldavad veakomponenti. Tõenäosusmudel on matemaatiline funktsioon, mis x-teljel loeb üles kõik võimalikud sündmustest ja y-teljel annab nende kõikide toimumise tõenäosused.

Statistiline mudel koosneb 3 komponendist:

> (1) matemaatiline struktuur, mis sisaldab muutujaid ja annab mudeli tüübi, 

> (2) tuunitavad parameetrid ja 

> (3) veamudel.

Muide, kõik veamudelid, millega me edaspidi töötame, modelleerivad igale x-i väärtusele (kaalule) sama suure y-i suunalise varieeruvuse (pikkuste sd). Suurem osa statistikast kasutab eeldusi, mida keegi päriselt tõe pähe ei võta, aga millega on arvutuslikus mõttes lihtsam elada.

2.5.1. Enimkasutatud veamudel on normaaljaotus.

Normaaljaotuse matemaatiline kirjeldus on suhteliselt keeruline, aga see on puhtalt tingitud vajadusest jaotuse aluse pindala normaliseerimisest ühele. Tegelikult võime demonstreerida normaaljaotuse kujulist jaotust väga lihtsate vahenditega. Järgnev näitab ka, millised looduslikud protsessid võiksid tekitada normaalseid andmed, ja millised mitte.

normaaljaotuse võib saada lihtsa liitmise teel. Oletame, et bakteri kasvukiirust mõjutavad 12 geeni, mille mõjud võivad olla väga erineva tugevusega, kuid nende mõjude suurused ei sõltu üksteisest. Seega nende 12 geeni mõjud kasvukiirusele liituvad. Järgnevas koodis me võtame 12 juhuvalimit arvudest 1 ja 100 vahel (kasutades runif() funktsiooni). Need 12 arvu näitavad 12 erineva geeni individuaalsete mõjude suurusi bakteritüve kasvukiirusele. Meil on seega kuni 100-kordsed erinevused erinevate geenide mõjude suuruste vahel. Seejärel liidame need 12 arvu. Nüüd võtame uue 12-se valimi ja kordame eelnevat. Me teeme seda 10 000 korda järjest ja plotime saadud 10 000 arvu (10 000 liitmistehte tulemust) tihedusfuntksioonina.

kasv <- replicate( 10000 , sum( runif(12,1,100) ) ) 
dens( kasv )

Selles näites võrdub iga andmepunkt 10 000st ühe bakteritüve kasvukiiruse mõõtmisega (eeldades, et mõõtmisviga puudub). Seega, antud eelduste korral on bakteritüvede kasvukiirused normaaljaotusega.

Nüüd vaatame, mis juhtub kui 12 geeni mõjud ei ole üksteisest sõltumatud. Kui 12 geeni on omavahel vastasmõjudes, siis nende geenide mõjud korrutuvad, mitte ei liitu. Kõigepealt vaatleme juhtu, kus 12 geeni on kõik väikeste mõjudega ning seega mitte ühegi geeni mõju ei domineeri teiste üle. Seekord võtame oma 12 juhuvalimit arvudest 1 ja 1.1 vahel. 1 tähendab 0-kasvu ja 1.1 tähendab 10% kasvu. Seejärel korrutame need 12 arvu, misjärel kordame eelnevat 10 000 korda.

kasv <- replicate( 10000 , prod( runif(12,1,1.1) ) ) 
dens( kasv )

Eelmises näites olid need üksikud interakteeruvad geenid ükshaaval väikeste mõjudega. Mitte ühegi geeni mõju ei domineeri teiste üle. Mis juhtub, kui mõnel geenil on kuni 2 korda suurem mõju kui teisel?

kasv <- replicate( 10000 , prod( runif(12,1,2) ) ) 
dens( kasv )

Nüüd on tulemuseks log-normaaljaotus. Mis teie arvate, kas bioloogias on enamasti tegu faktoritega, mis omavahel ei interakteeru või kui interakteeruvad, on kõik ühtlaselt väikeste efektidega? Või on tegu interakteeruvate faktoritega, millest osad on palju suuremate mõjudega uuritavale tunnusele, kui teised? Ühel juhul eelistate te normaaljaotuse mudeleid, teisel juhul peate õppima töötama ka lognormaaljaotusega.

Kui me vaatame samu andmeid logaritmilises skaalas, avastame, et need andmed on normaaljaotusega.

kasv <- replicate( 10000 , log10(prod( runif(12,1,2) ) ) )
dens( kasv )

Normaaljaotuse mudel väikestel valimitel

Oletame, et meil on kolm andmepunkti ning me usume, et need andmed on juhuslikult tõmmatud normaaljaotusest või sellele lähedasest jaotusest. Normaaljaotuse mudelit kasutades me sisuliselt deklareerime, et me usume, et kui me oleksime olnud vähem laisad ja 3 mõõtmise asemel sooritanuks 3000, siis need mõõtmised sobituksid piisavalt hästi meie 3 väärtuse peal fititud normaaljaotusega. Seega, me usume, et omades 3 andmepunkti me teame juba umbkaudu, millised tulemused me oleksime saanud korjates näiteks 3 miljonit andmepunkti. Oma mudelist võime simuleerida ükskõik kui palju andmepunkte.

Aga pidage meeles, et selle mudeli fittimiseks kasutame me ainult neid andmeid, mis meil päriselt on — ja kui meil on ainult 3 andmepunkti, on tõenäoline, et fititud mudel ei kajasta hästi tegelikkust.

Halvad andmed ei anna kunagi head tulemust.

Eelnev ei kehti Bayesi mudelite kohta, mis toovad priorite kaudu sisse lisainfot, mis ei kajastu valimiandmetes ja võib analüüsi päästa.

Kuidas panna skeptik uskuma, et statistilised meetodid töötavad halvasti väikestel valimitel? Siin aitab simulatsioon, kus me tõmbame 3-se valimi etteantud populatsioonist ning üritame selle valimi põhjal ennustada selleasama populatsiooni struktuuri. Kuna tegemist on simulatsiooniga, teame täpselt, et populatsioon, kust me tõmbame oma kolmese valimi, on normaaljaotusega, et tema keskväärtus = 0 ja et tema sd = 1. Me fitime oma valimi andmetega 2 erinevat mudelit: normaaljaotuse ja Studenti t jaotuse.


Attaching package: 'ggthemes'

The following object is masked from 'package:mosaic':

    theme_map

Joonis: juhuvalim normaaljaotusest, mille keskmine=0 ja sd=1 (n=3; andmepunktid on näidatud mustade munadena). Sinine joon - popualtsioon, millest tõmmati valim; punane joon - normaaljaotuse mudel, mis on fititud valimi andmetel; must joon - Studenti t jaotuse mudel, mis on fititud samade andmetega.

Mõlemad mudelid on süstemaatiliselt nihutatud väiksemate väärtuste poole ja alahindavad varieeruvust. t jaotuse mudel on oodatult paksemate sabadega ja ennustab 0-st kaugele palju rohkem väärtusi kui normaaljaotuse mudel. Kuna me teame, et populatsioon on normaaljaotusega, pole väga üllatav, et t jaotus modeleerib seda halvemini kui normaaljaotus.

Igal juhul, mõni teine juhuvalim annaks meile hoopis teistsugused mudelid, mis rohkem või vähem erinevad algsest populatsioonist.

Mis juhtub kui me kasutame oma normaaljaotuse mudelit uute andmete simuleerimiseks? Kui lähedased on need simuleeritud andmed populatsiooni andmetega ja kui lähedased valimi andmetega, millega me normaaljaotuse mudeli fittisime?

set.seed(19) #muudab simulatsiooni korratavaks
#tõmbame 3 juhuslikku arvu normaalhaotusest, mille keskväärtus = 0 ja sd = 1.
df <- tibble(sample_data=rnorm(3)) 
#fitime normaaljaotuse mudeli valimi keskmise ja sd-ga
mean(df$sample_data); sd(df$sample_data)
[1] -0.3817353
[1] 0.7896821
#simuleerime 1000 uut andmepunkti fititud mudelist
simulated_data <- rnorm(1000, mean(df$sample_data), sd(df$sample_data))
#arvutame simuleeritud andmete keskmise ja sd ning joonistame neist histogrammi
mean(simulated_data); sd(simulated_data); hist(simulated_data)
[1] -0.3848133
[1] 0.7749198

Nagu näha, on uute (simuleeritud) andmete keskväärtus ja SD väga sarnased algsete andmete omale, mida kasutasime mudeli fittimisel. Kahjuks ei ole need aga kaugeltki nii sarnased algsele jaotusele, mille kuju me püüame oma andmete ja mudeli pealt ennustada. Seega on meie mudel üle-fittitud, mis tähendab, et ta kajastab liigselt neid valimi aspekte, mis ei peegelda algse populatsiooni omadusi. Loomulikult ei vasta ükski mudel päriselt tegelikkusele. Küsimus on pigem selles, kas mõni meie mudelitest on piisavalt hea, et olla kasulik. Vastus sellele sõltub, milleks plaanime oma mudelit kasutada.

mean(simulated_data>0); mean(simulated_data>1)
[1] 0.317
[1] 0.037

Kui populatsiooniväärtustest on 50% suuremad kui 0, siis mudeli järgi vaevalt 32%. Kui populatsiooniväärtustest on 16% suuremad kui 1, siis mudeli järgi vaevalt 4%. See illustreerib hästi mudeli kvaliteeti.

library(brms)
sim_t <- rstudent_t(1000, 2, mean(df$sample_data), sd(df$sample_data))
mean(sim_t>0); mean(sim_t>1)
[1] 0.338
[1] 0.11

Samad ennustused t jaotusest on isegi paremad! Aga kumb on ikkagi parem mudel populatsioonile?

2.6. normaaljaotuse ja lognormaaljaotuse erilisus

Normaaljaotus ja lognormaaljaotus on erilised sest

  1. keskne piirteoreem ütleb, et olgu teie valim ükskõik millise jaotusega, paljudest valimitest arvutatud aritmeetilised keskmised on alati enam-vähem normaaljaotusega (kui n>30). Selle matemaatilise formalismi tuletus füüsikalisse maailma on nn “elementaarsete vigade hüpotees”, mille kohaselt paljude väikeste üksteisest sõltumatute juhuslike efektide (vigade) summa annab tulemuseks normaaljaotuse. Paraku annavad enamus bioloogilisi mõõtmisi eranditult mitte-negatiivseid tulemusi. Sageli on selliste mõõtmiste tulemuste jaotused ebasümmeetrilised (v.a. siis, kui cv = sd/mean on väike) ja siis on meil sageli tegu lognormaaljaotusega, mis tekkib log-normaalsete muutujate korrutamisest (mitte liitmisest, nagu normaaljaotuse puhul). Keskne piirteoreem 2: suvalise jaotusega muutujate geomeetrilised keskmised on lognormaaljaotusega. Elementaarsete vigade hüpotees 2: Kui juhuslik varieeruvus tekib paljude juhuslike efektide korrutamisel, on tulemuseks lognormaaljaotus. Lognormaaljaotuse elementide (arvude) logaritmimisel saame normaaljaotuse.

  2. Mõlemad jaotused (normaal ja lognormaal) on maksimaalse entroopiaga jaotused. Entroopiat vaadeldakse siin informatsiooni/müra kaudu — maksimaalse entroopiaga süsteem sisaldab maksimaalselt müra ja minimaalselt informatsiooni (Shannoni informatsiooniteooria). See tähendab, et väljaspool oma parameetrite tuunitud väärtusi on need normaal- ja lognormaaljaotused minimaalselt informatiivsed. Näiteks normaaljaotusel on kaks parameetrit, mu ja sigma (ehk keskmine ja standardhälve). Seega, andes normaaljaotusele ette keskväärtuse ja standardhälbe fikseerime üheselt jaotuse ehk mudeli kuju ja samas lisame sinna minimaalselt muud (sooviamtut) informatsiooni. Teised maksimaalse entroopiaga jaotused on eksponentsiaalne jaotus, binoomjaotus ja poissoni jaotus. Maksimaalse entroopiaga jaotused sobivad hästi Bayesi prioriteks sest me suudame paremini kontrollida, millist informatsiooni me neisse surume.

2.7. Küsimused, mida statistika küsib

Statistika abil saab vastuseid järgmisetele küsimustele:

  1. kuidas näevad välja teie andmed ehk milline on just teie andmete jaotus, keskväärtus, varieeruvus ja koos-varieeruvus? Näiteks, mõõdetud pikkuste ja kaalude koos-varieeruvust saab mõõta korrelatsioonikordaja abil.

  2. mida me peaksime teie valimi andmete põhjal uskuma populatsiooni parameetri tegeliku väärtuse kohta? Näiteks, kui meie andmete põhjal arvutatud keskmine pikkus on 178 cm, siis kui palju on meil põhjust arvata, et tegelik populatsiooni keskmine pikkus > 185 cm?

  3. mida ütleb statistilise mudeli struktuur teadusliku hüpoteesi kohta? Näiteks, kui meie poolt mõõdetud pikkuste ja kaalude koos-varieeruvust saab hästi kirjeldada kindlat tüüpi lineaarse regressioonimudeliga, siis on meil ehk tõendusmaterjali, et pikkus ja kaal on omavahel sellisel viisil seotud ja eelistatud peaks olema teaduslik teooria, mis just sellise seose tekkimisele bioloogilise mehhanismi annab.

  4. mida ennustab mudel tuleviku kohta? Näiteks, meie lineaarne pikkuse-kaalu mudel suudab ennustada tulevikus kogutavaid pikkuse andmeid. Aga kui hästi?

statistika ülesanne on lähtuvalt piiratud hulgast andmetest ja mudelitest kvantifitseerida parimal võimalikul viisil kõhedust, mida peaksime tundma vastates eeltoodud küsimustele.

Statistika ei vasta otse teaduslikele küsimustele ega küsimustele päris maailma kohta. Statistilised vastused jäävad alati kasutatud andmete ja mudelite piiridesse. Sellega seoses peaksime eelistama hästi kogutud rikkalikke andmeid ja paindlikke mudeleid. Siis on lootust, et hüpe mudeli koefitsientidest päris maailma kirjeldamisse tuleb üle kitsama kuristiku. Bayesil on siin eelis, sest osav statistik suudab koostöös teadlastega priori mudelisse küllalt palju kasulikku infot koguda. Samas, amatöör suudab bayesi abil samavõrra käkki keerata. Mida paindlikum on meetod, seda vähem automaatne on selle mõistlik kasutamine.

3. Kuidas näevad välja teie andmed?

3.1. summaarsed statistikud

Summaarne statistik = üks number.
Milliseid statistikuid arvutada ja milliseid vältida, sõltub statistilisest mudelist

summaarse statistika abil iseloomustame a) tüüpilist valimi liiget (keskmist), b) muutuja sisest varieeruvust, c) erinevate muutujate (pikkus, kaal vms) koos-varieeruvust

3.1.1. keskväärtused

Keskväärtust saab mõõta paaril tosinal erineval viisil, millest järgnevalt kasutame kolme või nelja. Enne kui te arvutama kukute, mõelge järele, miks te soovite keskväärtust teada. Kas teid huvitab valimi tüüpiline liige? Kuidas te sooviksite seda tüüpilisust defineerida? Kas valimi keskmise liikmena või valimi kõige arvukama liikmena? või veel kuidagi? See, millist keskväärtust kasutada sõltub sageli andmejaotuse kujust. Sümmeetrilisi jaotusi on lihtsam iseloomustada ja mitmetipulised jaotused on selles osas kõige kehvemad.

Mina eelistan selliseid nõuandeid (mis on rangelt soovituslikud):

  1. Kui valim on normaaljaotusega (histogramm on sümmeetriline), hinda tüüpilist liiget läbi aritmeetilise keskmise (mean).

  2. Muidu kasuta mediaani (median). Kui valim on liiga väike, et jaotust hinnata (aga > 4), eelista mediaani. Mediaani saamiseks järjestatakse mõõdetud väärtused suuruse järgi ja võetakse selle rea keskmine liige. Mediaan on vähem tundlik ekstreemsete väärtuste (outlierite) suhtes kui mean.

  3. Valimi kõige levinumat esindajat iseloomustab mood ehk jaotuse tipp. Seda on aga raskem täpselt määrata ja mitmetipulisel jaotusel on mitu moodi. Töötamisel posterioorsete jaotustega on mood sageli parim lahendus.

[1] 0.6817168

Joonis: Simuleeritud lognormaaljaotusega andmed. Punane joon - mood; sinine joon - mediaan; must joon - aritmeetiline keskmine (mean). Milline neist vastab parimini teie intuitsiooniga nende andmete “keskväärtusest”? Miks?

3.1.2. muutuja sisene varieeruvus

Mean-iga käib kokku standardhälve (SD).

SD on sama ühikuga, mis andmed (ja andmete keskväärtus). Statistikute hulgas eelistatud formaat on mean (SD), mitte mean (+/- SD). 1 SD katab 68% normaaljaotusest, 2 SD – 96% ja 3 SD – 99%. Normaaljaotus langeb servades kiiresti, mis tähendab, et tal on peenikesed sabad ja näiteks 5 SD kaugusel keskmisest paikneb vaid üks punkt miljonist.

Näiteks: inimeste IQ on normaaljaotusega, mean=100, sd=15. See tähendab, et kui sinu IQ=115 (ülikooli astujate keskmine IQ), siis on tõenäosus, et juhuslikult kohatud inimene on sinust nutikam, 18% ((100% - 68%)/2 = 18%).

Kui aga “tegelikul” andmejaotusel on “paks saba” või esinevad outlierid, siis normaaljaotust eeldav mudel tagab ülehinnatud SD ja seega ülehinnatud varieeruvuse. Kui andmed saavad olla ainult positiivsed, siis SD > mean/2 viitab, et andmed ei sobi normaaljaotuse mudeliga (sest mudel ennustab negatiivsete andmete esinemist küllalt suure sagedusega).

Normaaljaotus on defineeritud ka mõnede teiste jaotuste jaoks peale normaaljaotuse 
(Poissioni jaotus, binoomjaotus). 
Funktsioon sd() ja selle taga olev valem, mis on loodud normaaljaotuse tarbeks, 
ja neid alternatiivseid standardhälbeid ei arvuta. 
Seega tasub meeles pidada, et tavapärane sd kehtib normaaljaotuse mudeli piirides ja ei kusagil mujal!

Kui andmed ei sobi normaaljaotusesse siis võib pakkuda kahte alternatiivset lahendust:

(1) logaritmi andmed.

Kui logaritmimine muudab andmed normaalseks, siis saab logaritmitud andmetest arvutada mean-i ja SD ja seejärel mõlemad anti-logaritmida. Sellisel juhul avaldad sa lõpuks geomeetrilise keskmise ja multiplikatiivse SD (multiplikatiivne SD = geom mean x SD; geom mean/SD). Geomeetriline keskmine on alati väiksem kui aritmeetiline keskmine. Lisaks on SD interval nüüd asümmeetriline ja SD on alati > 0. Nagu ennegi, 68% lognormaalsetest andmetest jääb 1SD vahemikku ning 95.5% andmetest jääb 2SD vahemikku.

lognormaalsete andmete tavapärane iseloomustus keskmise ja standardhälbega: mean(sd) on 1.8(1.9). See sd interval on sümmeetriline, ehkki andmete jaotus on vägagi ebasümmeetriline. Lisaks ennustab standardhälve, mis on suurem kui keskväärtus, suure sagedusega negatiivseid väärtusi. Sageli on aga negatiivsed muutuja väärtused võimatud (näiteks nädalas suitsetatud sigarettide arv). See on näide halvast mudelist!

Juhul kui tegu lognormaalsete andmetega on meil võimalus kasutada palju paremat mudelit varieeruvusele - multiplikatiivset standardhälvet:

Tavalise aritmeetitilise keskmise asemel on meil nüüd geomeetriline keskmine. Võrdluseks on antud ka tavaline (aritmeetiline) keskmine ja (aditiivne) SD. Additiivne SD on selle jaotuse kirjeldamiseks selgelt ebaadekvaatne (vt jaotuse pilti ülalpool ja võrdle mulitplikatiivse SD-ga).

Kuidas aga töötab multiplikatiivne standardhälve normaaljaotusest pärit andmetega? Kui normaalsete andmete peal multiplikatiivse sd rakendamine viib katastroofini, siis pole sel statistikul suurt praktilist kasutusruumi.

set.seed(5363)
norm_andmed <- rnorm(3, 100, 20)
multiplicative_sd(norm_andmed)

Nagu näha, on multiplikatiivse sd kasutamine normaalsete andmetega üsna ohutu (kuigi, ainult niikaua, kuni meil puuduvad negatiivsed andmed). Seega, kui sa ei ole kindel, kas tegu on normaaljaotusega või lognormaaljaotusega, arvesta, et lognormaaljaotus on bioloogias üsna tavaline (eriti ensüümreaktsioonide ja kasvuprotsesside juures). Seega on mõistlik alati kasutada multiplicative_sd() funktsiooni ja kui mõlema SD väärtused on sarnased, siis võib loota, et andmed on normaalsed ning saab avaldada tavapärase additiivse SD refereede rõõmuks.

kui n < 10, siis mõlemad SD-d alahindavad tehnilistel põhjustel tegelikku sd-d. Ettevaatust väikeste valimitega!

(2) iseloomusta andmeid algses skaalas: median (MAD).

MAD –– median absolute deviation — on vähem tundlik outlierite suhtes ja ei eelda normaaljaotust. Puuduseks on, et MAD ei oma tõlgendust, mille kohaselt ta hõlmaks kindlat protsenti populatsiooni või valimi andmejaotusest. Seevastu sd puhul võime olla kindlad, et isegi kõige hullema jaotuse korral jäävad vähemalt 75% andmetest 2 SD piiridesse.

mad(andmed, constant = 1)
[1] 0.5950562
 Ära kunagi avalda andmeid vormis: mean (MAD) või median (SD). 
 Korrektne vorm on mean(SD) või median(MAD).

3.1.3. muutujate koos-varieeruvus

Andmete koos-varieeruvust mõõdetakse korrelatsiooni abil. Tulemuseks on üks number - korrelatsioonikordaja r, mis varieerub -1 ja 1 vahel.

r = 0 – kahte tüüpi mõõtmised (x=pikkus, y=kaal) samadest mõõteobjektidest varieeruvad üksteisest sõltumatult. 
r = 1: kui ühe muutuja väärtus kasvab, kasvab ka teise muutuja väärtus alati täpselt samas proportsioonis. 
r = -1: kui ühe muutuja väärtus kasvab, kahaneb teise muutuja väärtus alati täpselt samas proportsioonis. 

Kui r on -1 või 1, saame me x väärtust teades täpselt ennustada y väärtuse (ja vastupidi, teades y väärrust saame täpselt ennustada x väärtuse).
Kuidas tõlgendame aga tulemust r = 0.9? Mitte kuidagi. Selle asemel tõlgendame r2 = 0.9**2 = 0.81 – mis tähendab, et x-i varieeruvus suudab seletada 81% y varieeruvusest ja vastupidi, et Y-i varieeruvus suudab seletada 81% X-i varieeruvusest.

#correlation<-cor.test(iris$Sepal.Length, iris$Sepal.Width, na.rm=T, method = "pearson") # a list of 9
#names(correlation)
#str(correlation)
#correlation$conf.int
cor(iris$Sepal.Length, iris$Sepal.Width, use="complete.obs") 
[1] -0.1175698

Korrelatsioonikordaja väärtus sõltub mitte ainult andmete koos-varieeruvusest vaid ka andmete ulatusest. Suurema ulatusega andmed X ja/või Y teljel annavad keskeltläbi 0-st kaugemal oleva korrelatsioonikordaja. Selle pärast sobib korrelatsioon halvasti näiteks korduskatsete kooskõla mõõtmiseks.

Lisaks, korrelatsioonikordaja mõõdab vaid andmete lineaarset koos-varieeruvust: kui andmed koos-varieeruvad mitte-lineaarselt, siis võivad ka väga tugevad koos-varieeruvused jääda märkamatuks.

Kõik summaarsed statistikud kaotavad enamuse teie andmetes leiduvast infost – see kaotus on õigustatud ainult siis, kui teie poolt valitud statistik iseloomustab hästi andmete sügavamat olemust (näiteks tüüpilist mõõtmistulemust või andmete varieeruvust).

#Kuidas arvutada correlatsioonimaatriksit koos adjusteeritud p väärtustega
#numeric columns only!
print(psych::corr.test(iris[-5], use="complete"), short = FALSE)

3.2 EDA — eksploratoorne andmeanalüüs

Kui ühenumbriline andmete summeerimine täidab eelkõige kokkuvõtliku kommunikatsiooni eesmärki, siis EDA on suunatud teadlasele endale. EDA eesmärk on andmeid eelkõige graafiliselt vaadata, et saada aimu 1) andmete kvaliteedist ja 2) lasta andmetel “sellisena nagu nad on” kõneleda ja sugereerida uudseid teaduslikke hüpoteese. Neid hüpoteese peaks siis testima formaalse statistilise analüüsi abil.

EDA: mida rohkem graafikuid, seda rohkem võimalusi uute mõtete tekkeks!

Kõigepealt vaatame andmeid numbrilise kokkuvõttena:

psych::describe(iris)
             vars   n mean   sd median trimmed  mad min max range  skew kurtosis   se
Sepal.Length    1 150 5.84 0.83   5.80    5.81 1.04 4.3 7.9   3.6  0.31    -0.61 0.07
Sepal.Width     2 150 3.06 0.44   3.00    3.04 0.44 2.0 4.4   2.4  0.31     0.14 0.04
Petal.Length    3 150 3.76 1.77   4.35    3.76 1.85 1.0 6.9   5.9 -0.27    -1.42 0.14
Petal.Width     4 150 1.20 0.76   1.30    1.18 1.04 0.1 2.5   2.4 -0.10    -1.36 0.06
Species*        5 150 2.00 0.82   2.00    2.00 1.48 1.0 3.0   2.0  0.00    -1.52 0.07

Millised korrelatsioonid võiksid andmetes esineda?

library(corrgram) #PCA for ordering
corrgram(iris, order=TRUE, 
         lower.panel = panel.pts,
         upper.panel = panel.ellipse,
         diag.panel = panel.density,
         main="Correlogram of Iris dataset")

3.2.1. Kuidas uurida muutuja sisest varieeruvust

Muutuja - midagi, mida mõõdeti (näiteks mõõteobjektide kaal). Kui iga muutuja kohta on vaid üks number, mida plottida, kasuta Cleveland plotti:

dd <- diamonds %>% group_by(clarity) %>% summarise(number_of_diamonds=n())
dd %>% ggplot(aes(x=number_of_diamonds, 
                  y=reorder(clarity, number_of_diamonds))) +
  geom_point(size=3) +
  theme_bw() +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.y = element_line(colour="grey60", linetype="dashed")) +
  labs(y="clarity")

3.2.2. Ploti valik sõltub valimi suurusest.

  1. N < 20 - ploti iga andmepunkt eraldi (stripchart(), plot()) ja keskmine või mediaan.

  2. 20 > N > 100: geom_dotplot() histogrammi vaates

  3. N > 100: geom_histogram(), geom_density() — nende abil saab ka 2 kuni 6 jaotust võrrelda

  4. Mitme jaotuse kõrvuti vaatamiseks kui N > 15: geom_boxplot() or, when N > 50, geom_violin(), geom_joy()

ToothGrowth <- ToothGrowth
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
p<-ggplot(ToothGrowth, aes(x=dose, y=len)) + 
  geom_dotplot(binaxis='y', stackdir='center')
p

# Change dotsize and stack ratio, add line or dot for median
ggplot(ToothGrowth, aes(x=dose, y=len)) + 
  geom_dotplot(binaxis='y', stackdir='center',
               stackratio=1.5, dotsize=0.7)+
  stat_summary(fun.y = median, geom = "point", shape = 95, 
               color = "red", size = 15) +
  theme_tufte()

p + stat_summary(fun.y=median, geom="point", shape=18,
                 size=5, color="red")

#add mean and SD, use pointrange
p + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange", color="red")

#use errorbars
p + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), 
        geom="errorbar", color="red", width=0.2) +
  stat_summary(fun.y=mean, geom="point", size=3, color="red")

Nii saab plottida multiplikatiivse sd:

# Function to produce summary statistics (geometric mean and multipülicative sd)
multi_sd <- function(x) {
  x <- na.omit(x)
  a <- log10(x)
  b <- mean(a)
  c <- sd(a)
  g_mean <- 10**b
  msd <- 10**c
  ymin <- g_mean/msd
  ymax <- g_mean * msd
 return(c(y = g_mean, ymin = ymin, ymax = ymax)) 
}
p + stat_summary(fun.data=multi_sd, color="blue", size=1.1) + theme_tufte()

# Change dot plot colors by groups
p<-ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose)) +
  geom_dotplot(binaxis='y', stackdir='center')
p

It is also possible to change manually dot plot colors using the functions :

scale_fill_manual() : to use custom colors

scale_fill_brewer() : to use color palettes from RColorBrewer package

scale_fill_grey() : to use grey color palettes

#Choose which items to display :
p + scale_x_discrete(limits=c("0.5", "2"))

Dotplot kui histogram:

ggplot(iris, aes(Sepal.Length)) + geom_dotplot()

Histogram:

ggplot(iris, aes(Sepal.Length)) + 
  geom_histogram(bins = 10, color="white", fill = "navyblue") 

library(ggthemes)
d <- iris        # Full data set
d_bg <- d[, -5]  # Background Data - full without the 5th column (Species)
ggplot(data = d, aes(x = Sepal.Width, fill = Species)) +
  geom_histogram(data = d_bg, fill = "grey", alpha=0.8, bins=10) +
  geom_histogram(colour = "black", bins=10) +
  facet_grid(Species~.) +
  guides(fill = FALSE) +  # to remove the legend
  theme_tufte()          # for clean look overall

density plot:

iris%>%ggplot()+
  geom_density(aes(Sepal.Width, fill=Species, color=Species, alpha=0.5))+
  theme_tufte()

joyplot võimaldab kõrvuti panna isegi sadu density plotte

library(ggjoy)
ggplot(iris, aes(x=Sepal.Length, y=Species, fill=Species)) + 
  geom_joy(scale=4, rel_min_height=0.01, alpha=0.9) +
  theme_joy(font_size = 13, grid=TRUE) + 
  theme(legend.position = "none")

Boxplot:

ggplot(iris, aes(Species, Sepal.Width, fill=Species)) + geom_boxplot()

violin plot plus jitterplot:

ggplot(iris, aes(Species, Sepal.Width)) + 
  geom_violin(aes(fill=Species)) +
  geom_jitter(width = 0.1, alpha=0.4, size=0.5)

3.2.3. Kahe muutuja koos-varieeruvus

  
ggplot(data = diamonds, aes(x = depth, y = price)) +
  geom_point(size=0.1, alpha=0.1) +
  geom_density2d()

Fit a linear model and plot the dots and model:

ggplot(data=iris, aes(Sepal.Width, Petal.Width))+
  geom_point()+
  geom_smooth(method="lm", color="red") 

3.3. Kokkuvõte:

  1. Andmepunktide plottimine säilitab maksimaalselt andmetes olevat infot (nii kasulikku infot kui müra). Aitab leida outliereid (valesti sisestatud andmeid, valesti mõõdetud proove jms). Kui valim on väiksem kui 20, piisab täiesti üksikute andmepunktide plotist koos mediaaniga. Dot-plot ruulib.

  2. Histogramm – kõigepealt mõõtskaala ja seejärel andmed jagatakse võrdse laiusega binnidesse ja plotitakse binnide kõrgused. Bin, kuhu läks 20 andmepunkti on 2X kõrgem kui bin, kuhu läks 10 andmepunkti. Samas, bini laius/ulatus mõõteskaalal pole teile ette antud – ja sellest võib sõltuda histogrammi kuju. Seega on soovitav proovida erinevaid bini laiusi ja võrrelda saadud histogramme. Histogramm sisaldab vähem infot kui dot plot, aga võimaldab paremini tabada seaduspärasid & andmejaotust & outliereid suurte andmekoguste korral.

  3. Density plot. Silutud versioon histogrammist, mis kaotab infot aga toob vahest välja signaali müra arvel. Density plotte on hea kõrvuti vaadelda joy ploti abil.

  4. Box-plot – sisaldab vähem infot kui histogramm, kuid neid on lihtsam kõrvuti võrrelda. Levinuim variant (kuid kahjuks mitte ainus) on Tukey box-plot – mediaan (joon), 50% IQR (box) ja 1,5x IQR (vuntsid), pluss outlierid eraldi punktidena.

  5. Violin plot – informatiivsuselt box-ploti ja histogrammi vahepeal – sobib paljude jaotuste kõrvuti võrdlemiseks

  6. Line plot – kasuta ainult siis kui nii X kui Y teljele on kantud pidev väärtus (pikkus, kaal, kontsentratsioon, aeg jms). Ära kasuta, kui teljele kantud punktide vahel ei ole looduses mõtet omavaid pidevaid väärtusi (näiteks X teljel on katse ja kontroll või erinevad valgumutatsioonid, mille aktiivsust on mõõdetud)

  7. Suhete võrdlemine (pie vs bar)

  8. Cleveland plot countide jaoks. Kasuta Barplotti ainult siis, kui Cleveland plot vm plot mingil põhjusel ei sobi. Barplot võiks olla viimane valik.

Informatsiooni hulk kahanevalt: iga andmepunkt plotitud (dot plot) -> histogram -> density plot/violin plot -> box plot -> bar plot standardhälvetega -> Cleveland plot (barplot ilma veapiirideta)

Jäta meelde:

  1. statistika uurib formaalseid mudeleid, mitte teooriaid ega päris maailma.

  2. Statistika jagatakse kahte ossa: kirjeldav ja järeldav (inferential).

  3. Kirjeldav statistika kirjeldab teie andmeid summaarsete statistikute ning graafiliste meetodite abil.

  4. Järeldav statistika püüab teie andmete põhjal teha järeldusi statistilise populatsiooni kohta, millest need andmed pärinevad

  5. Statistika põhiline ülesanne on kvantifitseerida ebakindlust, mis ümbritseb neid järeldusi.

3.4. Sõnastik

  • Statistiline populatsioon – objektide kogum, millele soovime teha statistilist üldistust. Näiteks hinnata keskmist ravimi mõju patsiendipopulatsioonis. Või Escherichia coli ensüümi X keskmist Kcat-i.

  • Valim – need objektid (patsiendid, ensüümiprepid), mida me reaalselt mõõdame.

  • Juhuvalim – valim, mille liikmed on populatsioonist valitud juhuslikult ja iseseisvalt. See tähendab, et kõigil populatsiooni liikmetel (kõikidel patsientidel või kõikidel võimalikel ensüümipreparatsioonidel) on võrdne võimalus sattuda valimisse JA, et valimisse juba sattunud liikme(te) põhjal ei ole võimalik ennustada järgmisena valimisse sattuvat liiget.

  • Esinduslik valim – Valim on esinduslik, kui ta peegeldab hästi statistilist populatsiooni. Ka juhuvalim ei pruugi olla esinduslik (juhuslikult).

  • Statistik – midagi, mis on täpselt arvutatud valimi põhjal (näiteks pikkuste keskmine)

  • Parameetri väärtus – teadmata suurus, mille täpset väärtust me saame ainult umbkaudu ennustada aga mitte kunagi täpselt teada. (näiteks mudeli intercept, populatsiooni keskmine pikkus; efekti suurus = katsegrupi keskmine – kontrollgrupi keskmine)

  • Statistiline mudel – matemaatiline formaliseering, mis sageli koosneb 2st osast: determinismlik protsessi-mudel pluss juhuslik vea/varieeruvuse-mudel. Protsessi-mudeli näiteks kujutle, et mõõdad mitme inimese pikkust (X muutuja) ja kaalu (Y muutuja). Sirge võrrandiga Y = a + b * X (kaal = a + b * pikkus) saab anda determinismliku lineaarse ennustuse kaalu kohta: kui X (pikkus) muutub ühe ühiku (cm) võrra, siis muutub Y (kaal) väärtus keskmiselt b ühiku (kg) võrra. Seevastu varieeruvuse-mudel on tõenäosusjaotus (näit normaaljaotus). Selle abil modelleeritakse Y-suunalist andmete varieeruvust igal X väärtusel (näiteks, milline on 182 cm pikkuste inimeste oodatav kaalujaotus). Mudel on seega tõenäosuslik: me saame näiteks küsida: millise tõenäosusega kaalub 182 cm pikkune inimene üle 100 kilo. Mida laiem on varieeruvuse mudeli Y-i suunaline jaotus igal X-i väärtusel, seda kehvemini ennustab mudel, millist Y väärtust võime konkreetselt oodata mingi X-i väärtuse korral. Lineaarsete mudelite eesmärk ei ole siiski mitte niivõrd uute andmete ennustamine (seda teevad paremini keerulised mudelid), vaid mudeli struktuurist lähtuvalt põhjuslike hüpoteeside püstitamine/kontrollimine (kas inimese pikkus võiks otseselt reguleerida/kontrollida tema kaalu?). Kuna selline viis teadust teha töötab üksnes lihtsate mudelite korral, on enamkasutatud statistilised mudelid taotluslikult lihtsustavad ja ei pretendeeri tõelähedusele.

  • Tehniline replikatsioon – sama proovi (patsienti, ensüümipreparatsiooni, hiire pesakonna liiget) mõõdetakse mitu korda. Mõõdab tehnilist varieeruvust ehk mõõtmisviga. Seda püüame kontrollida parandades mõõtmisaparatuuri/protokolle või siis juba andmete tasemel, statistilise analüüsiga. Näiteks saame andmeid agregeerida ja arvutada keskväärtuse. Kui andmepunkte on piisavalt ja varieeruvus on sümmeetriline ümber tõelise populatsiooniväärtuse, siis annab keksväärtus meile hea hinnangu parameetri tõelisele väärtusele.

  • Bioloogiline replikatsioon – erinevaid patsiente, ensüümipreppe, erinevate hiirepesakondade liikmeid mõõdetakse, igaüht üks kord. Eesmärk on mõõta Bioloogilist varieeruvust, mis tuleneb mõõteobjektide reaalsetest erinevustest: iga patsient ja iga ensüümimolekul on erinev kõigist teistest omasugustest. Bioloogiline varieeruvus on teaduslikult huvitav ja seda saab visualiseerida algandmete tasemel (mitte keskväärtuse tasemel) näiteks histogrammina. Teaduslikke järeldusi tehakse bioloogiliste replikaatide põhjal. Tehnilised replikaadid seevastu kalibreerivad mõõtesüsteemi täpsust. Kui te uurite soolekepikest E. coli, ei saa te teha formaalset järeldust kõigi bakterite kohta. Samamoodi, kui te uurite vaid ühe hiirepesakonna/puuri liikmeid, ei saa te teha järeldusi kõikide hiirte kohta. Kui teie katseskeem sisaldab nii tehnilisi kui bioloogilisi replikaate on lihtsaim viis neid andmeid analüüsida kõigepealt keskmistada üle tehniliste replikaatide ning seejärel kasutada saadud keskmisi edasistes arvutustes üle bioloogiliste replikaatide (näiteks arvutada nende pealt uue keskmise, standardhälve ja/või usaldusintervalli). Selline kahe-etapiline arvutuskäik ei ole siiski optimaalne. Optimaalne, kuid keerukam, on panna mõlemat tüüpi andmed ühte hierarhilisse mudelisse.

Tõenäosuse (P) reeglid on ühised kogu statistikale:

  • P jääb 0 ja 1 vahele; P(A) = 1 tähendab, et sündmus A toimub kindlasti.
  • kui sündmused A ja B on üksteist välistavad, siis tõenäosus, et toimub sündmus A või sündmus B on nende kahe sündmuse tõenäosuste summa — P(A v B) = P(A) + P(B).
  • Kui A ja B ei ole üksteist välistavad, siis P(A v B) = P(A) + P(B) – P(A & B).
  • kui A ja B on üksteisest sõltumatud (A toimumise järgi ei saa ennustada B toimumist ja vastupidi) siis tõenäosus, et toimuvad mõlemad sündmused on nende sündmuste tõenäosuste korrutis –– P(A & B) = P(A) x P(B).
  • Kui B on loogiliselt A alamosa, siis P(B) < P(A)
  • P(A | B) –– tinglik tõenäosus. Sündmuse A tõenäosus, juhul kui peaks toimuma sündmus B. P(vihm | pilves ilm) ei ole sama, mis P(pilves ilm | vihm).
  • Juhul kui P(B)>0, siis P(A | B) = P(A & B)/P(B) ehk
  • P(A | B) = P(A) x P(B | A)/P(B) –– Bayesi teoreem.

Kuigi kõik statistikud lähtuvad tõenäosustega töötamisel täpselt samadest matemaatilistest reeglitest, tõlgendavad erinevad koolkonnad saadud numbreid erinevalt. Kaks põhilist koolkonda on sageduslikud statistikud ja Bayesiaanid.

  • Tõenäosus, sageduslik tõlgendus – pikaajaline sündmuste suhteline sagedus. Näiteks 6-te sagedus paljudel täringuvisetel. Sageduslik tõenäosus on teatud tüüpi andmete sagedus, tingimusel et nullhüpotees (H0) kehtib; ehk P(andmed | H0). Nullhüpotees ütleb enamasti, et uuritava parameetri (näiteks ravimiefekti suurus) väärtus on null. Seega, kui P on väike, ei ole seda tüüpi andmed kooskõlas arvamusega, et parameetri väärtus on null (mis aga ei tähenda automaatselt, et sa peaksid uskuma, et parameetri väärtus ei ole null).

  • Tõenäosus, Bayesi tõlgendus – usu määr mingisse hüpoteesi. Näiteks 62% tõenäosus (et populatsiooni keskmine pikkus < 180 cm) tähendab, et sa oled ratsionaalse olendina nõus kulutama mitte rohkem kui 62 senti kihlveo peale, mis võidu korral toob sulle sisse 1 EUR (ja 38 senti kasumit). Bayesi tõenäosus omistatakse statistilisele hüpoteesile (näiteks, et ravimiefekti suurus jääb vahemikku a kuni b), tingimusel, et sul on täpselt need andmed, mis sul on; ehk P(hüpotees | andmed).

LS0tCnRpdGxlOiAiMi4gU2lzc2VqdWhhdHVzIGFuZG1lYW5hbMO8w7xzaSIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgpgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGdnam95KQpsaWJyYXJ5KGNvcnJncmFtKQpsaWJyYXJ5KG1vZGVscikKbGlicmFyeShicm9vbSkKYGBgCgpTZWUgw7VwaWsgb24ga2lyanV0YXR1ZCBpbmltZXN0ZWxlLCBrZXMga2FzdXRhdmFkLCBtaXR0ZSBlaSB1dXJpLCBzdGF0aXN0aWthdC4gw5VwaWt1IGthc3V0YWphIHBlYWtzIG9sZW1hIHbDtWltZWxpbmUgdMO2w7Z0YW1hIFIga2Vza2tvbm5hcy4gTWVpZSBsw6RoZW5lbWlzZWQgc3RhdGlzdGlrYSDDtXBldGFtaXNlbGUgb24gYXJ2dXR1c2xpa3VkLCBtaXMgdMOkaGVuZGFiLCBldCBtZSBlZWxpc3RhbWUgbWVldG9kaSBtYXRlbWFhdGlsaXNlIGFsdXNlIGFzZW1lbCDDtXBldGFkYSBzZWxsZSBrYXN1dGFtaXN0IGphIHR1bGVtdXN0ZSB0w7VsZ2VuZGFtaXN0LiBTZWUgw7VwaWsgb24gYmF5ZXNpYWFubGlrIGphIGVpIMO1cGV0YSBzYWdlZHVzbGlra3Ugc3RhdGlzdGlrYXQuIE1lIHVzdW1lLCBldCBuaWkgb24gbGlodHNhbSBqYSB0dWx1c2FtIHN0YXRpc3Rpa2F0IMO1cHBpZGEgamEgZXQgQmF5ZXNpIHN0YXRpc3Rpa2F0IGthc3V0YWRlcyBzYWFiIHJhaHVsZGFkYSA5OSUgdGVpZSB0ZWdlbGlrZXN0IHN0YXRpc3RpbGlzdGVzdCB2YWphZHVzdGVzdCBwYXJlbWluaSwga3VpIHNlZSBvbiB2w7VpbWFsaWsga2xhc3Npa2FsaXN0ZSBzYWdlZHVzbGlrZSBtZWV0b2RpdGVnYS4gTWUgdXN1bWUga2EsIGV0IGt1aWdpIHByYWVndXNlZCBraWlyZWQgYXJlbmd1ZCBiYXllc2kgc3RhdGlzdGlrYXMgb24gdMOkbmFzZWtzIGp1YmEgdmlpbnVkIHNlbGxlIHN1dXJlbCBtw6TDpHJhbCB0YXZha2FzdXRhamFsZSBrw6R0dGVzYWFkYXZhc3NlIHZvcm1pLCB0b292YWQgbMOkaGlhYXN0YWQgc2VsbGVzIHZhbGxhcyB2ZWVsIHN1dXJpIG11dXR1c2kuIE5lbmRlIG11dXR1c3RlZ2Ega29vcyBwZWFiIGFyZW5lbWEga2EgYmF5ZXNpIMO1cGV0YW1pbmUuIAoKTWUga2FzdXRhbWUgasOkcmdtaXNpIFItaSBwYWtldHRlLCBtaXMgb24ga8O1aWsgbG9vZHVkIGJheWVzaSBtdWRlbGl0ZSByYWtlbmRhbWlzZSBsaWh0c3VzdGFtaXNla3M6IHJldGhpbmtpbmcsIGJybXMsIHJzdGFuYXJtLCBCYXllc2lhbkZpcnN0QWlkIGphIGJheWVzcGxvdC4gTGlzYWtzIHZlZWwgYmF5ZXNib290IGJvb3RzdHJhcGltaXNla3MuIEJheWVzaSBhcnZ1dHVzdGVrcyBrYXN1dGF2YWQgbmVlZCBwYWtldGlkIFN0YW4gamEgSkFHUyBtY21jIHPDpG1wbGVyZWlkICh2aWltYXN0IGvDvGxsIGFpbnVsdCBCYXllc2lhbkZpcnN0QWlkIHBha2V0KS4gU2VsbGUgw7VwaWt1IHZhbG1pbWlzZWwgb24ga2FzdXRhdHVkIE1jRWxyZWF0aGksIEtydXNjaGtlIGphIEdlbG1hbmkgw7VwaWt1aWQgKFZJSVRFRCkuIMOVcGlrdXMgb24gw6RyYSB0b29kdWQgZW5hbXVzIGthc3V0YXR1ZCBSIGtvb2Rpc3QgZWVzbcOkcmdpZ2EsIGV0IGx1Z2VqYSBwcm9vdmlrcyBzZWRhIGtvb2RpIGlzZSBrb2R1cyBqb29rc3V0YWRhIGphIG1vZGlmaXRzZWVyaWRhLiBTZWxsaW5lIGtvb2RpZ2EgbcOkbmdpbWluZSBhbm5hYiB0ZWlsZSB2w6TDpHJ0dXNsaWtrdSBpbnR1aXRzb29uaSBzdGF0aXN0aWthIHRvaW1pbWlzZSBvc2FzIGp1c3Qgc2VsbGlzdGUgYW5kbWV0ZSBrb3JyYWwsIG1pcyB0ZWllIGVsdXMgZG9taW5lZXJpdmFkLiAKCkx1Z2VqYWQsIGtlbGxlbGUgb24ganViYSDDtXBldGF0dWQgc2FnZWR1c2xpa2t1IHN0YXRpc3Rpa2F0LCB2w7VpdmFkIHRhaHRhIHRlYWRhLCBtaWxsZSBwb29sZXN0IHNlZSBlcmluZWIgYmF5ZXNpIHN0YXRpc3Rpa2FzdC4gRWhra2kgbWUgdXN1bWUsIGV0IGJheWVzaSBzdGF0aXN0aWthIMO1cGV0YW1pbmUgdsO1cmRsZXZhbHQgc2FnZWR1c2xpa3Ugc3RhdGlzdGlrYWdhIGVpIG9sZSBwYXJpbSBsYWhlbmR1cywgdsO1cmRsZW1lIGrDpHJnbmV2YWx0IGzDvGhpZGFsdCBzYWdlZHVzbGlra3UgamEgYmF5ZXNpIHBhcmFkaWdtYXNpZC4gS2VzIGVpIG9sZSDDtXBwaW51ZCBzYWdlZHVzbGlra3Ugc3RhdGlzdGlrYXQsIHbDtWlrc2lkIHNlbGxlIG9zYSB2YWhlbGUgasOkdHRhLgoKIyMgMi4xLiBLYWtzIHN0YXRpc3Rpa2F0OiBhamFsb29zdCBqYSB0w7VlbsOkb3N1c2VzdAoKQmF5ZXNpYWFubGlrIGphIHNhZ2VkdXNsaWsgc3RhdGlzdGlrYSBsZWl1dGF0aSDDvGtzdGVpc2UgasOkcmVsIFBpZXJyZS1TaW1vbiBMYXBsYWNlIHBvb2x0LCBrZXMgYXJlbmRhcyB2w6RsamEga8O1aWdlcGVhbHQgYmF5ZXNpIHN0YXRpc3Rpa2EgYWx1c2VkIG5pbmcgc2VlasOkcmVsIHNhZ2VkdXNsaWt1IHN0YXRpc3Rpa2Egb21hZCAoY2EuIDE4MDAgLSAxODEyKS4gU2FnZWR1c2xpa3Ugc3RhdGlzdGlrYSB0ZWtraW1pc2UgamEgaGlsaXNlbWEgw7VpdHNlbmd1IHDDtWhqdXMgMjAuIHNhamFuZGlsIG9saSBhcnZ1dHVzbGlrIGxpaHRzdXMuIEJheWVzaSBtZWV0b2RpdGVnYSBlaSBvbG51ZCB2w7VpbWFsaWsga29ycmFsaWt1bHQgdGVhZHVzdCB0ZWhhIGVubmUgMTk5MC1uZGFpZCBhYXN0YWlkLCBtaWwgcGVyc29uYWFsYXJ2dXRpdGUgbGV2aWsgYWxnYXRhcyBidXVtaSBuZW5kZSBtZWV0b2RpdGUgYXJlbmRhbWlzZXMuIFByYWVndSBvbiBtYWFpbG1hcyBiYXllc2kgamEgc2FnZWR1c2xpa2t1IHN0YXRpc3Rpa2F0IHVtYmVzIHBvb2xla3MgKHbDpGhlbWFsdCB1dXRlIG1lZXRvZGl0ZSBhcmVuZHVzdMO2w7YgcG9vbGUgcGVhbHQpLiBFZXN0aXMgYmF5ZXNpIHN0YXRpc3Rpa2EgMjAxNyBhYXN0YSBzZWlzdWdhIHBlYWFlZ3UsIGV0IHB1dWR1Yi4gCgpLYWhlIHN0YXRpc3Rpa2EgcMO1aGlsaW5lIGVyaW5ldnVzIGVpIHR1bGUgbWF0ZW1hYXRpa2FzdCAtLS0gbcO1bGVtYWQgaGFydWQgbMOkaHR1dmFkIHNhbWFkZXN0IHTDtWVuw6Rvc3VzdGVvb3JpYSBha3Npb29taWRlc3QgamEgbmVuZGUgdmFoZWwgcHV1ZHV2YWQgbWF0ZW1hYXRpbGlzZWQgbGFoa2FydmFtdXNlZCAtLS0gdmFpZCB0w7VlbsOkb3N1c2UgdMO1bGdlbmR1c2VzdC4gCgpCYXllc2kgdMO1bGdlbmR1c2VzIG9uIHTDtWVuw6Rvc3VzIHRlYWRsYXNlIHVzdSBtw6TDpHIgbWluZ2kgaMO8cG90ZWVzaSBrZWh0aW1pc3NlLiBIw7xwb3RlZXMgdsO1aWIgbsOkaXRla3Mgb2xsYSwgZXQgasOkcmdtaXNlIGp1dWxpa3V1IHNhZGVtZXRlIGh1bGsgVmlsc2FuZGlsIGrDpMOkYiB2YWhlbWlra3UgMjIga3VuaSAzNCBtbS4gS3VpIEJheWVzaSBhcnZ1dHVzIGFubmFiIHNlbGxlIGjDvHBvdGVlc2kgdMO1ZW7DpG9zdXNla3MgMC41Nywgc2lpcyBvbGVtZSBtZSBzZWxsZSB0ZWFkbWlzZSBuYWphbCBuw7V1cyBtYWtzbWEgbWl0dGUgcm9oa2VtIGt1aSA1NyBzZW50aSBraWhsdmVvIGVlc3QsIG1pbGxlIGFsdXNlbCBtYWtzdGFrc2UganVodWwsIGt1aSBzZWUgaMO8cG90ZWVzIHTDtWVzZWtzIG9zdXR1YiwgdsOkbGphIDEgRVVSIChqYSBtZSBzYWFtZSB2w6RoZW1hbHQgNDMgc2VudGkga2FzdW1pdCkuICAKClNhZ2VkdXNsaWt1ZCBzdGF0aXN0aWt1ZCB1c3V2YWQsIGV0IHNlbGxpbmUgdMO1ZW7DpG9zdXNlIHTDtWxnZW5kdXMgb24gZWJhdGVhZHVzbGlrLCBrdW5hIHNlZSBvbiAic3ViamVrdGlpdm5lIi4gCk9uIHbDtWltYWxpaywgZXQgbiB0ZWFkbGFzdCBhcnZ1dGF2YWQga29ycmVrdHNlbHQgc2FtYWRlIGFuZG1ldGUgcMO1aGphbCBuIGVyaW5ldmF0IHTDtWVuw6Rvc3VzdCBqYSB1c3V2YWQgc2VlZ2Egc2FtYWRlIHTDtWVuZGl0ZSBww7VoamFsIGVyaW5ldmFpZCBhc2p1LiAKU2VlIHbDtWliIGp1aHR1ZGEgc2lpcywga3VpIG5hZCBsw6RodHV2YWQgdsOkZ2EgZXJpbmV2YXRlc3QgdGF1c3RhdXNrdW11c3Rlc3Qgb21hIGjDvHBvdGVlc2lkZSBrZWh0aW1pc2Uga29odGEuIEt1aSB0ZSB1c3V0ZSwgZXQgdGVpZSB0YXVzdGF0ZWFkbWlzZWQgZWkgdG9oaSBtaW5naWwganVodWwgbcO1anV0YWRhIGrDpHJlbGR1c2ksIG1pcyB0ZSBvbWEgYW5kbWV0ZSBww7VoamFsIHRlZXRlLCBzaWlzIHRlIGVpIG9sZSBiYXllc2lhYW4uIApTZWwganVodWwgcGFrdWIgYWx0ZXJuYXRpaXZpIHNhZ2VkdXNsaWsgdMO1ZW7DpG9zdXNlIHTDtWxnZW5kdXMuIFNhZ2VkdXNsaWsgdMO1ZW7DpG9zdXMgb24gZGVmaW5lZXJpdHVkIGt1aSB0ZWF0dWQgdMO8w7xwaSBhbmRtZXRlIGVzaW5lbWlzZSBwaWthYWphbGluZSBzdWh0ZWxpbmUgc2FnZWR1cy4gCk7DpGl0ZWtzLCBrdWkgbWUgdmlza2FtZSBtw7xudGkgcGFsanUga29yZGksIHNpaXMgcGVha3Mga3VsbGlkZSAodsO1aSBraXJqYWRlKSBzdWh0ZWxpbmUgc2FnZWR1cyBtZWlsZSBhbmRtYSBzZWxsZSBtw7xuZGkgdMO1ZW7DpG9zdXNlIGxhbmdlZGEga2lyaSDDvGxldmFsLiAKU2VsbGluZSB0w7VlbsOkb3N1cyBvbiBvbWlzdGF0YXYgYWludWx0IHNlbGxpc3RlbGUgc8O8bmRtdXN0ZWxlLCBtaWxsZSBlc2luZW1pc2VsIG9uIHNhZ2VkdXMuIApUZWFkdXNsaWsgdGVvb3JpYSBlaSBvbGUgc2VsbGluZSBzw7xuZG11cy4gClNlZWdhIGVpIG9sZSBzYWdlZHVzbGlrdXMgc3RhdGlzdGlrYXMgdsO1aW1hbGlrIHLDpMOka2lkYSBrYSBow7xwb3RlZXNpIGtlaHRpbWlzZSB0w7VlbsOkb3N1c2VzdC4gU2FnZWR1c2xpayBsYWhlbmR1cyBvbiBzZWxsZSBhc2VtZWwsIGV0IHLDpMOka2lkYSBtZWllIGjDvHBvdGVlc2kgdMO1ZW7DpG9zdXNlc3QgbWVpZSBhbmRtZXRlIGtvcnJhbCwgcsOkw6RraWRhIGFuZG1ldGUsIG1pcyBzYXJuYW5ldmFkIG1laWUgYW5kbWV0ZWdhLCBlc2luZW1pc2UgdMO1ZW7DpG9zdXNlc3QgbnVsbC1ow7xwb3RlZXNpIChtaXMgZWkgb2xlIG1laWUgaMO8cG90ZWVzKSBrZWh0aW1pc2Uga29ycmFsLiAKU2VlZ2Egb21pc3RhdGFrc2Ugc2FnZWR1cyAoPSB0w7VlbsOkb3N1cykgYW5kbWV0ZWxlLCBtaXR0ZSBow7xwb3RlZXNpbGUuIApKw6RyZ25ldmFsdCB0b29tZSBuw6RpdGUsIGt1aWRhcyBiYXllc2lhYW4gamEgc2FnZWR1c2xpayBzdGF0aXN0aWsgbGFoZW5kYXZhZCBzYW1hIMO8bGVzYW5kZS4KCiMjIyAyLjEuMS4gVsO1cmRsZXYgbsOkaWRlOiBrYWhlIGdydXBpIHbDtXJkbHVzCgptZWlsIG9uIDIgZ3J1cHBpLCBrYXRzZSBqYSBrb250cm9sbCwgbWlsbGVzdCBrdW1tYWdpcyAzMCBtw7XDtXRtaXN0IGphIG1lIHNvb3ZpbWUgdGVhZGEsIGt1aSBwYWxqdSBrYXRzZXRpbmdpbXVzIG3DtWp1dGFiIG3DtcO1dG1pc3R1bGVtdXN0LiBNZWllIGFuZG1lZCBvbiBub3JtYWFsamFvdHVzZWdhIGphIGFuZG1lcHVua3RpZCwgbWlkYSBtZSBhbmFsw7zDvHNpbWUsIG9uIGVmZWt0aXN1dXJ1c2VkIChrYXRzZTEgLSBrb250cm9sbDEgPSBlczEgam5lKS4KCiMjIyNCYXllc2lhYW4gClN0YXRpc3RpbGluZSBrw7xzaW11cyBvbiBCYXllc2lhYW5pbCBqYSBzYWdlZHVzbGlrdWwgc3RhdGlzdGlrdWwgc2FtYToga2FzIGphIGt1aSBwYWxqdSBlcmluZXZhZCBrYWhlIGdydXBpIGtlc2t2w6TDpHJ0dXNlZD8gCkJheWVzaWFhbiBhbHVzdGFiIHNlbGxlc3QsIGV0IGVoaXRhYiBrYWtzIG11ZGVsaXQ6IGFuZG1ldGUgdMO1ZXDDpHJhbXVkZWwgamEgdGF1c3RhdGVhZG1pc3RlIG11ZGVsIGVoayBwcmlvci4gCgpLdWkgYW5kbWVkIG9uIG5vcm1hYWxqYW90dXNlZ2EsIHNpaXMgb24ga2EgdMO1ZXDDpHJhbXVkZWwgbm9ybWFhbGphb3R1cy4gQWx1c3RhbWUgc2VsbGVzdCwgZXQgZml0aW1lIG9tYSB2YWxpbWlhbmRtZWQgKMO8a3Npa3VkIGVmZWt0aSBzdXVydXNlZCkgbm9ybWFhbGphb3R1c2UgbXVkZWxpc3NlLgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9CmxpYnJhcnkoZ2d0aGVtZXMpCiNwYWtldHQgZ2dmb3J0aWZ5IHBha3ViIGFsdCBsYWhlbmR1c3QgamFvdHVzdGUgam9vbmlzdGFtaXNla3MKc2V0LnNlZWQoMTkpCmRmIDwtIHRpYmJsZShhPXJub3JtKDMwLCAwLjcsIDQpKQoKZGYgJT4lIGdncGxvdChhZXMoeD1hKSkgKwogIGdlb21fZG90cGxvdChiaW53aWR0aCA9IDEvMTAsYWxwaGE9MC41KSArIAogIHN0YXRfZnVuY3Rpb24oZnVuPWRub3JtLCBhcmdzPWxpc3QobWVhbj1tZWFuKGRmJGEpLHNkPXNkKGRmJGEpKSwgY29sb3VyPSJyZWQiKSArCiAgI3N0YXRfZnVuY3Rpb24oZnVuPWRub3JtLCBhcmdzPWxpc3QobWVhbj0wLCBzZD0xKSwgY29sb3VyPSJibHVlIikgKwogICNzdGF0X2Z1bmN0aW9uKGZ1bj1kc3R1ZGVudF90LCBhcmdzPWxpc3QoZGY9MiwgbXU9bWVhbihkZiRhKSwgc2lnbWE9c2QoZGYkYSkpKSsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PTApLCBsaW5ldHlwZT0yKSsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PSBtZWFuKGRmJGEpKSkrCiAgeGxpbSgtMTAsIDEwKSArIHlsaW0oMCwgMC4xNSkgKyBsYWJzKHg9TlVMTCwgeT1OVUxMKSArIHRoZW1lX3R1ZnRlKCkrIHhsYWIoIkVTIikKYGBgCgoqKkpvb25pcyAxLiBwYWFyaXZpaXNpbGluZSBrYXRzZSAtIGtvbnRyb2xsIGRpc2Fpbi4gS2F0c2V0IG9uIGtvcnJhdHVkIDMwIGtvcmRhLiBYIHRlbGplbCBvbiBlZmZla3RpIHN1dXJ1c2VkIChFUykuIDMwIEVTLWkgb24gbsOkaWRhdHVkIHB1bmt0aWRlbmEuIE11c3Qgam9vbiBuw6RpdGFiIGtlc2ttaXN0IEVTLWkuIEFuZG1lZCBvbiBtdWRlbGRhdHVkIG5vcm1hYWxqYW90dXNlbmEuKioKClNlZSBlaSBvbGUgdmVlbCB0w7VlcMOkcmFtdWRlbCwgc2VzdCBtZSB0YWhhbWUgaGlubmFuZ3V0IEVTICoqa2Vza3bDpMOkcnR1c2UqKiBrw7VpZ2UgdMO1ZW7DpG9saXNlbWFsZSB2w6TDpHJ0dXNlbGUsIGphIGxpc2FrcyB2ZWVsIGhpbm5hbmd1dCBlYmFraW5kbHVzZWxlIHNlbGxlIHB1bmt0LWhpbm5hbmd1IMO8bWJlciAodXNhbGR1c2xwaWlyZSkuClNlZWdhIHR1bGViIGVlbG1pbmUgamFvdHVzIGtpdHNhbWFrcyB0w7VtbWF0YSwgZXQgdGEga2FqYXN0YWtzIG1laWUgdGVhZG1pc2kgRVMtaWRlIGtlc2t2w6TDpHJ0dXN0ZSwgbWl0dGUgaW5kaXZpZHVhYWxzZXRlIEVTLWRlLCBrb2h0YS4gVXVlIGphb3R1c211ZGVsaSBzZCA9IGVlbG1pc2UgamFvdHVzZSBzZC9zcXJ0KDMwKS4KCmBgYHtyIGVjaG89RkFMU0V9CmRmICU+JSBnZ3Bsb3QoYWVzKHg9YSkpICsKICBzdGF0X2Z1bmN0aW9uKGZ1bj1kbm9ybSwgYXJncz1saXN0KG1lYW49bWVhbihkZiRhKSxzZD1zZChkZiRhKS9zcXJ0KDMwKSksIGNvbG91cj0icmVkIikgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9MCksIGxpbmV0eXBlPTIpKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9IG1lYW4oZGYkYSkpKSsKICB4bGltKC0xMCwgMTApICsgeWxpbSgwLCAwLjgpICsgbGFicyh4PU5VTEwsIHk9TlVMTCkgKyB0aGVtZV90dWZ0ZSgpKyB4bGFiKCJFUyIpCmBgYAoKKipKb29uaXMgMi4gU2VlIGphb3R1cyBpc2Vsb29tdXN0YWIga2Vza21pc2UgRVMgcGFpa25lbWlzdCBwdWh0YWx0IG1laWUgYW5kbWV0ZSBww7VoamFsLioqCgpUw6Rwc2VtYWx0LCBzZWxsZSBqb29uaXNlIHDDtWhqYWwgdsO1aWIgYXJ2dXRhZGEsIG1pbGxpbmUgb24gbWVpZSB2YWxpbWkga2Vza3bDpMOkcnR1c2Uga29odGFtaXNlIHTDtWVuw6Rvc3VzIGlnYWwgdsO1aW1hbGlrdWwgdMO1ZWxpc2VsIEVTLWkgdsOkw6RydHVzZWwuIEvDtWlnZSB0w7VlbsOkb2xpc2VtYWQgb24gYW5kbWVkIHNpaXMsIGt1aSB0ZWdlbGlrIEVTID0gYW5kbWV0ZSBrZXNrdsOkw6RydHVzZWdhIChzZWRhIGtvaHRhIG7DpGl0YWIgbXVzdCBqb29uKS4gS3VpIG1lIGphZ2FtZSBtdXN0YSBqb29uZSBwaWtrdXNlIHB1bmFzZSBrdXJ2aSBhbGwgbMOkYmkga2F0a2VuZGpvb25lIHBpa2t1c2VnYSBzYW1hIGt1cnZpIGFsbCwgc2FhbWUgdGVhZGEsIG1pdHUga29yZGEgb24gbWVpZSBhbmRtZWQgdMO1ZW7DpG9saXNlbWFkIHNpaXMsIGt1aSB0ZWdlbGlrIEVTID0gbWVhbih2YWxpbWkgRVMpLCB2w7VycmVsZGVzIG9sdWtvcnJhZ2EsIGt1cyB0ZWdlbGlrIEVTID0gMC4gTG9vbXVsaWt1bHQgdsO1aW1lIHNhbWEgbsOkaXRhamEgYXJ2dXRhZGEgw7xrc2vDtWlrIG1pbGxpc2UgaMO8cG90ZWVzaWRlIHBhYXJpIGtvaHRhIChuw6RpdGVrcywgYW5kbWVkIG9uIG1pbGpvbiBrb3JkYSB0w7VlbsOkb2xpc2VtYWQgaMO8cG90ZWVzaSBFUyA9IDAuMDIgYWxsIGt1aSBow7xwb3RlZXNpIEVTID0gLTEgYWxsOyBtaXMgYWdhIGVpIHTDpGhlbmRhLCBldCBhbmRtZWQgb2xla3NpZCB2w6RnYSB0w7VlbsOkb2xpc2VkIGt1bW1hZ2kgdsO1cnJlbGR1ZCBow7xwb3RlZXNpIGFsbCkuIAoKQWdhIHNlZSBlaSBvbGUgdmVlbCBCYXllcy4gTGlzYW1lIGFuZG1lbXVkZWxpbGUgdGF1c3RhdGVhZG1pc3RlIG11ZGVsaS4gU2VsbGVnYSB0w7xoaXN0YW1lIG1lIHbDpGdhIG9sdWxpc2UgZWVsZHVzZSwgbWlzIHJpcHViIHZlc2tpa2l2aW5hIHNhZ2VkdXNsaWt1IHN0YXRpc3Rpa2Ega2FlbGFzLiBOaW1lbHQsIGV0IHZhbGltaSBhbmRtZWQgcGVhdmFkIG9sZW1hIGVzaW5kdXNsaWt1ZCBwb3B1bGF0c2lvb25pIHN1aHRlcy4gTWUgdsO1aW1lIG9sbGEgw7xzbmEga2luZGxhZCwgZXQgdsOkaWtlc3RlIHZhbGltaXRlIGtvcnJhbCBzZWUgZWVsZHVzIGVpIGtlaHRpIGphIHNlbGxlZ2Egc2Vvc2VzIGVpIHTDtsO2dGEga2Egc2FnZWR1c2xpayBzdGF0aXN0aWthIHZpaXNpbCwgbWlsbGVrcyBSLkEuIEZpc2hlciBzZWxsZSBrdW5hZ2kgbMO1aS4gVGF1c3RhdGVhZG1pc3RlIG11ZGVsaSByb2xsIChrdWlnaSBtaXR0ZSBhaW51cykgb24gw7VybmFsdCBzdXVuYXRhIG1laWUgaGlubmFuZ3V0IMO1aWdlcyBzdXVuYXMgdsOkaGVuZGFkZXMgaGFsYmFkZSBhbmRtZXRlIHbDtWltZXQgbWVpbGUga2FoanUgdGVoYS4gS3VpIHN1bCBvbiB2w6Rpa2UgdmFsaW0sIHNpaXMgc2ludSBhbmRtZWQgdmFqYXZhZCBzZWxsaXN0IGthbnRzZWxkYW1pc3QuCgpPbGd1IG1laWUgdGF1c3RhdGVhZG1pc2UgbXVkZWwgbm9ybWFhbGphb3R1cyBrZXNrdsOkw6RydHVzZWdhIDAgamEgc3RhbmRhcmRow6RsYmVnYSAxCgpgYGB7ciBlY2hvPUZBTFNFfQpkZiAlPiUgZ2dwbG90KGFlcyh4PWEpKSArCiAgc3RhdF9mdW5jdGlvbihmdW49ZG5vcm0sIGFyZ3M9bGlzdChtZWFuPW1lYW4oZGYkYSksc2Q9c2QoZGYkYSkvc3FydCgzMCkpLCBjb2xvdXI9InJlZCIpICsKICBzdGF0X2Z1bmN0aW9uKGZ1bj1kbm9ybSwgYXJncz1saXN0KG1lYW49MCxzZD0xKSkgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9MCksIGxpbmV0eXBlPTIpKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9IG1lYW4oZGYkYSkpKSsKICB4bGltKC0xMCwgMTApICsgeWxpbSgwLCAwLjgpICsgbGFicyh4PU5VTEwsIHk9TlVMTCkgKyB0aGVtZV90dWZ0ZSgpKyB4bGFiKCJFUyIpCmBgYAoKKipKb29uaXMgMy4gVGF1c3RhdGVhZG1pc3RlIG11ZGVsIGUgcHJpb3Igb24gbXVzdCBub3JtYWFsamFvdHVzLCBtaWxsZSDDvGxlc2FubmUgb24gdmVpZGkgdsOkaGVuZGFkYSBla3N0cmVlbXNldGUgdmFsaW1pdGUga2FoanVsaWtrdSBtw7VqdS4qKiAKClRhdXN0YXRlYWRtaXN0ZSBtdWRlbCBvbiBzYWdlbGkgbm9ybWFhbGphb3R1cy4gS3VpIG1laWwgb24gcGFsanUgdGF1c3RhdGVhZG1pc2ksIHNpaXMgb24gc2VlIGphb3R1cyBrw7VyZ2UgamEga2l0c2FzLCBrdWkgbWVpbCBvbiB2w6RoZSB0YXVzdGF0ZWFkbWlzaSwgc2lpcyBvbiBzZWUgbWFkYWwgamEgbGFpLgoKICAgICAgTWlkYSB0ZWhhLCBrdWkgc2EgZWkgdGFoYSwgZXQgdGF1c3RhdGVhZG1pc3RlIG11ZGVsIHNpbnUgCiAgICAgIHBvc3RlZXJpb3JpIGt1anUgbcO1anV0YWI/IFNlbGxpc2VsIGp1aHVsIGthc3V0YXRha3NlIG7DtXJnYWx0IAogICAgICBpbmZvcm1hdGlpdnNlaWQgcHJpb3JlaWQsIG1pcyB0w6RoZW5kYWIsIGV0IHByaW9yaSAKICAgICAgamFvdHVzIG9uIHBhbGp1IGxhaWVtIGt1aSB0w7VlcMOkcmFtdWRlbGkgbGFpdXMuIE1pa3MgbWl0dGUgCiAgICAgIGthc3V0YWRhIG1pdHRlLWluZm9ybWF0aWl2c2VpZCB0YXNhc2VpZCBwcmlvcmVpZD8gCiAgICAgIFDDtWhqdXNlZCBvbiBhcnZ1dHVzbGlrdWQsIHNlZWdhIHRlaG5pbGlzdCBsYWFkaS4KCklnYWwganVodWwgasOkcmdtaXNlIHNhbW11bmEga29ycnV0YWIgYmF5ZXNpYWFuIHNlbGxlIGphb3R1c2UgYW5kbWVqYW90dXNlZ2EsIHNhYWRlcyB0dWxlbXVzZWtzIGtvbG1hbmRhIG5vcm1hYWxqYW90dXNlLCBtaWxsZSB0YSBzZWVqw6RyZWwgbm9ybWFsaXNlZXJpYiBuaWksIGV0IGphb3R1c2UgYWx1bmUgcGluZGFsYSA9IDEuIApTZWUga29sbWFzIGphb3R1cyBvbiBwb3N0ZXJpb29ybmUgdMO1ZW7DpG9zdXNqYW90dXMsIG1pcyBzaXNhbGRhYiBrb2d1IGluZm90LCBtaWxsZXN0IHNhYWIgYXJ2dXRhZGEga8O1aWdlIHTDtWVuw6RvbGlzZW1hIGthdHNlZWZla3RpIHN1dXJ1c2Uga29vcyBlYmFraW5kbHVzZSBtw6TDpHJhZ2Egc2VsbGUgw7xtYmVyIChtaWRhIHJvaGtlbSBhbmRtZWlkLCBzZWRhIHbDpGlrc2VtIGViYWtpbmRsdXMpIGphIHTDtWVuw6Rvc3VzZWQsIGV0IHRlZ2VsaWsga2F0c2VlZmVrdCBqw6TDpGIgw7xrc2vDtWlrIG1pbGxsaXNlc3NlIG1laWQgaHV2aXRhdmFzc2UgdmFoZW1pa2t1LgoKTsO8w7xkIGVpIG9sZSBzaWlzIG11dWQga3VpIGJheWVzaSBtdWRlbCBsw6RiaSBhcnZ1dGFkYS4KYGBge3IgaW5jbHVkZT1GQUxTRX0KZGYgPC0gYXMuZGF0YS5mcmFtZShkZikKbSA8LSBtYXAyc3RhbihhbGlzdCgKICAgIGEgfiBkbm9ybSggbWVhbj1tdSAsIHNkPXNpZ21hICkgLAogICAgbXUgIH4gZG5vcm0oMCwgMSkgLCAKICAgIHNpZ21hIH4gZGNhdWNoeSgwLDEpCiksIGRhdGE9ZGYpCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KbW0gPC0gYXMuZGF0YS5mcmFtZShtQHN0YW5maXQpCmdncGxvdChtbSwgYWVzKG11KSkrIAogIGdlb21fZGVuc2l0eShjb2xvcj0iZGFya2dyZWVuIiwgZmlsbD0iZ3JlZW4iLCBhbHBoYT0wLjIpKyAKICBzdGF0X2Z1bmN0aW9uKCBmdW49ZG5vcm0sIGFyZ3M9bGlzdChtZWFuPW1lYW4oZGYkYSksc2Q9c2QoZGYkYSkvc3FydCgzMCkpLCBjb2xvdXI9InJlZCIpICsKICBzdGF0X2Z1bmN0aW9uKCBmdW49ZG5vcm0sIGFyZ3M9bGlzdChtZWFuPTAsc2Q9MSkpICsKICB4bGltKC0xMCwxMCkrIHhsYWIoIkVTIikrIHRoZW1lX3R1ZnRlKCkKYGBgCgoqKkpvb25pcyA0LiBUcmlwbG90LiBCYXllc2kgdsOkbGp1bmQgb24gcG9zdGVyaW9vcm5lIHTDtWVuw6Rvc3VzamFvdHVzIChyb2hlbGluZSkuIE5hZ3UgbsOkaGEsIGVpIG9sZSBzZWxsZSBqYW90dXNlIHRpcHAgdMOkcHNlbHQgc2FtYXMga29oYXMga3VpIGFuZG1lamFvdHVzZSB0aXBwIGVoayBrZXNrdsOkw6RydHVzLiBQcmlvciB0w7VtYmFiIHNlZGEgdmVpZGkgbnVsbGkgc3V1bmFzLiBMaXNha3Mgb24gcG9zdGVlcmlvciB2ZWlkaSBraXRzYW0ga3VpIGFuZG1lbXVkZWwsIG1pcyB0w6RoZW5kYWIsIGV0IGhpbm5hbmcgRVMtbGUgdHVsZWIgdsOkaWtzZW1hIGViYWtpbmRsdXNlIG3DpMOkcmFnYS4qKgoKUG9zdGVlcmlvciBzaXNhbGRhYiBlbmRhcyBrb2d1IGluZm90LCBtaXMgbWVpbCBFUy1pIHTDtWVsaXNlIHbDpMOkcnR1c2Uga29odGEgb24uIFNpaXQgc2FhbWUgYXJ2dXRhZGEKCjEuIHBhcmltYSBoaW5uYW5ndSBFUy1pIHB1bmt0dsOkw6RydHVzZWxlLCAKCjIuIHVzYWxkdXNpbnRlcnZhbGxpLCBlaGsgbWlsbGlzZXN0IEVTLWlkZSB2YWhlbWlrdXN0IGxvb2RhbWUgbGVpZGEgdMO1ZWxpc2UgRVMtaSBuw6RpdCA5MCUgdMO1ZW7DpG9zdXNlZ2EsCgozLiBpZ2EgbcO1ZWxkYXZhIEVTLWkgdsOkw6RydHVzdGUgdmFoZW1pa3Uga29odGEgdMO1ZW7DpG9zdXNlLCBtaWxsZWdhIHTDtWVsaW5lIEVTIGrDpMOkYiBzZWxsZXNzZSB2YWhlbWlra3UuCgo0LiBzYWFtZSBFUy1pIHDDtWhqYWwgYXJ2dXRhZGEgbcO1bmUgbXV1IHN0YXRpc3Rpa3UsIG7DpGl0ZWtzIEVTMSA9IGxvZyhFUyksIGthc3V0YWRlcyBzZWxsZWtzIEVTLWkgcG9zdGVyaW9vcnNldCBqYW90dXN0LiBTZWwgdmlpc2lsIGthbm5hbWUgb21hIEVTLWkgaGlubmFuZ3VzIHBlaXR1dmEgZWJha2luZGx1c2Ugw7xsZSBFUzEtbGUsIG1pbGxlbGUgc2FhbWUgc2FtdXRpIHJha2VuZGFkYSBwdW5rdGUgMS0zIChzZXN0IEVTMSBvbiBwb3N0ZXJpb29ybmUgamFvdHVzKS4KCjUuIHV1dGUgYW5kbWV0ZSBsaXNhbmR1bWlzZWwgc2FhbWUga2FzdXRhZGEgRVMtaSBwb3N0ZWVyaW9yaXQgdXVlIHByaW9yaW5hIGphIGFydnV0YWRhIHV1ZSB0w6RpZW5kYXR1ZCBwb3N0ZWVyaW9yaS4gUMO1aGltw7V0dGVsaXNlbHQgdsO1aW1lIHNlZGEgdGVoYSBww6RyYXN0IGlnYSDDvGtzaWt1IGFuZG1lcHVua3RpIGxpc2FuZHVtaXN0LiBTZWUgYXZhYiBrYSBoZWFkIHbDtWltYWx1c2VkIG1ldGFhbmFsw7zDvHNpa3MuCgo2LiBsaXNha3Mgc2FhbWUgb21hIGFsZ3Nlc3QgbXVkZWxpc3Qga2EgcG9zdGVlcmlvcmkgYW5kbWVwdW5rdGkgdGFzZW1lbCB2YXJpZWVydXZ1c2VsZSAgKHBvbGUgbsOkaWRhdHVkKS4gU2VkYSBrYXN1dGFtZSB1dXRlIGFuZG1ldGUgc2ltdWxlZXJpbWlzZWtzIChtZWllIG7DpGl0ZXMgw7xrc2lrdWQgRVMtZCkuCgojIyMjU2FnZWR1c2xpayBzdGF0aXN0aWsgClNhZ2VkdXNsaWsgbMOkaGVuZW1pbmUgc2lzYWxkYWIgYWludWx0IMO8aHRlIG11ZGVsaXQsIG1pZGEgdsO1cnJlbGRha3NlIHZhbGltaSBhbmRtZXRlZ2EuIApTYWdlZHVzbGlrIHN0YXRpc3RpayBhbHVzdGFiIHNlbGxlcyBsaWh0c2FzIG7DpGl0ZXMgdMOkcHNlbHQgc2FtYW1vb2RpIG5hZ3UgYmF5ZXNpYWFuLCB0ZWtpdGFkZXMgZWVsbWlzZWdhIGlkZW50c2UgYW5kbWVtdWRlbGksIG1pcyBvbiBrZXNrZW5kYXR1ZCB2YWxpbWkga2Vza3bDpMOkcnR1c2VsZSAoSm9vbmlzIDIpLiAKU2VlasOkcmVsIG5paHV0YWIgdGEgb21hIGFuZG1lbXVkZWxpdCBuaWlwYWxqdSwgZXQgbm9ybWFhbGphb3R1c2UgdGlwcCBlaSBvbGUgZW5hbSB2YWxpbWkga2Vza3bDpMOkcnR1c2Uga29oYWwgdmFpZCBob29waXMgMC1lZmVrdGkga29oYWwuIEphb3R1c2UgbGFpdXMgbmlodXRhbWlzZWwgZWkgbXV1dHUuIAoKYGBge3IgZWNobz1GQUxTRX0KZGYgJT4lIGdncGxvdChhZXMoeD1hKSkgKwogIHN0YXRfZnVuY3Rpb24oZnVuPWRub3JtLCBhcmdzPWxpc3QobWVhbj1tZWFuKGRmJGEpLHNkPXNkKGRmJGEpL3NxcnQoMzApKSwgY29sb3VyPSJyZWQiLCBhbHBoYT0wLjIpICsKICBzdGF0X2Z1bmN0aW9uKGZ1bj1kbm9ybSwgYXJncz1saXN0KG1lYW49MCxzZD1zZChkZiRhKS9zcXJ0KDMwKSkpICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PTApLCBsaW5ldHlwZT0yKSsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PSBtZWFuKGRmJGEpKSkrCiAgeGxpbSgtMTAsIDEwKSArIHlsaW0oMCwgMC44KSArIGxhYnMoeD1OVUxMLCB5PU5VTEwpICsgdGhlbWVfdHVmdGUoKSsgeGxhYigiRVMiKQpgYGAKCgpTZWRhIG51bGxpbGUgdHNlbnRyZWVyaXR1ZCBtdWRlbGl0IGt1dHN1dGFrc2UgbnVsbC1ow7xwb3RlZXNpa3MgKEgwKS4gCk7DvMO8ZCB2w7VyZGxlYiB0YSBvbWEgdmFsaW1pIGtlc2t2w6TDpHJ0dXN0IChtdXN0IGpvb24pIEgwIGphb3R1c2VnYS4gCkt1aSB2YWxpbWkga2Vza3bDpMOkcnR1c2Uga29oYWwgb24gSDAgamFvdHVzIGvDtXJnZSwgc2lpcyBvbiBhbmRtZXRlIHTDtWVuw6Rvc3VzIEgwIGtlaHRpbWlzZSBrb3JyYWwgc3V1ci4gCkphIHZhc3R1cGlkaSwga3VpIHZhbGltaSBrZXNrdsOkw6RydHVzZSBrb2hhbCBvbiBIMCBtYWRhbCwgc2lpcyBvbiBhbmRtZXRlIGVzaW5lbWlzZSB0w7VlbsOkb3N1cyBIMCBhbGwgbWFkYWwuIApTZWRhIHTDtWVuw6Rvc3VzdCBrdXRzdXRha3NlIHAgdsOkw6RydHVzZWtzLiAKTWlkYSB2w6Rpa3NlbSBvbiBwLCBzZWRhIHbDpGhlbSB0w7VlbsOkb2xpc2VkIG9uIHRlaWUgYW5kbWVkIGp1aHVsLCBrdWkgSDAgb24gdMO1ZW5lIGphIGthdHNlZWZla3QgdsO1cmR1YiBudWxsaWdhLiAKUCBvbiBkZWZpbmVlcml0dWQga3VpICJ0ZWllIGFuZG1ldGUgdsO1aSAwLXN0IHZlZWwga2F1Z2VtYWwgYXN1dmF0ZSBhbmRtZXRlIGVzaW5lbWlzZSBwaWthYWphbGluZSBzdWh0ZWxpbmUgc2FnZWR1cyB0aW5naW11c2VsLCBldCBIMCBrZWh0aWIiLiAKCiMjIyN0dWxlbXVzdGUgdMO1bGdlbmRhbWluZQpLdWkgc2FnZWR1c2xpayBzdGF0aXN0aWsga2lyanV0YWIsIGV0IHRlbWEgImVmZWt0aSBzdXVydXMgb24gc3RhdGlzdGlsaXNlbHQgb2x1bGluZSAwLjA1IG9sdWxpc3Vzbml2b29sIiwgc2lpcyB0YSDDvHRsZWIgc2VsbGVnYSwgZXQgdGVtYSBwb29sdCBhcnZ1dGF0dWQgcCA8IDAuMDUuIApTZWxsZSB2w6RpdGUga29ycmVrdG5lIHTDtWxnZW5kdXMgb24sIGV0IGp1aHVsIGt1aSBzdGF0aXN0aWsgcGlrYSBhamEgam9va3N1bCB2w7V0YWIgb21ha3MgInN0YXRpc3RpbGlzZWx0IG9sdWxpc3RlbmEiIGvDtWlrIHR1bGVtdXNlZCwgbWlsbGVnYSBrYWFzbmV2IHAgIDwgMC4wNSBqYSBsw7xra2FiIHRhZ2FzaSBrw7VpayB0dWxlbXVzZWQsIG1pbGxlIHAgPiAwLjA1LCBzaWlzIHNvb3JpdGFiIHRhIDUlIHNhZ2VkdXNlZ2EgdMO8w7xwIDEgdmlndS4gClNlZSB0w6RoZW5kYWIsIGV0IGlnYXN0IHNhamFzdCB0w7Vlc2VzdCBIMC1zdCwgbWlkYSB0YSB0ZXN0aWIsIHbDtXRhYiB0YSBrZXNrZWx0bMOkYmkgNSB2YXN0dSwga3VpIHN0YXRpc3RpbGlzZWx0IG9sdWxpc2VkLiAKU2FnZWR1c2xpayBzdGF0aXN0aWthIG9uIHBhcmltIHZpaXMgdMO8w7xwIDEgdmlnYWRlIHNhZ2VkdXNlIHBpa2FhamFsaXNla3MgZmlrc2VlcmltaXNla3MuIApQYXJha3UgZWkgdGVhIG1lIMO8aGVnaSDDvGtzaWt1IHRlc3RpIGtvaHRhIGV0dGUsIGthcyBzZWUgdGVzdGliIGtlaHRpdmF0IHbDtWkgbWl0dGVrZWh0aXZhdCBIMC1pLCBtaXMgdGVlYiByYXNrZWtzIGthdHNlc2VlcmlhdGUgw7xoZWthdXBhIHTDtWxnZW5kYW1pc2UuIApUdWxldGFtZSBtZWVsZGUsIGV0IHNhZ2VkdXNsaWt1cyBzdGF0aXN0aWthcyBlaSBzYWEgcsOkw6RraWRhIEgwIGtlaHRpbWlzZSB0w7VlbsOkb3N1c2VzdCB2YWlkIHBlYWIgcsOkw6RraW1hIGFuZG1ldGUgdMO1ZW7DpG9zdXNlc3QgKGVoayBhbmRtZXRlIGVzaW5lbWlzZSBzYWdlZHVzZXN0KSB0aW5naW11c2VsLCBldCBIMCBrZWh0aWIuIAoKKipLYXMgw7xodGUgcCB2w6TDpHJ0dXN0IHNhYWIgdMO1bGdlbmRhZGEga3VpIGhpbm5hbmd1dCB0w7VlbmR1c21hdGVyamFsaSBodWxnYWxlLCBtaWRhIHRlaWUgdmFsaW0gcGFrdWIgSDAgdmFzdHU/KiogClNlbGxlIMO8bGUgb24gdmFpZWxkdWQganViYSDDvGxlIDgwIGFhc3RhLCBrdWlkIHR1bmR1YiwgZXQgYWludXMgdmlpcyBzZWRhIGthcyB2w7VpIHVtYmthdWR1IHRlaGEgb24gYmF5ZXNpYWFubGlrLiBJZ2FsIGp1aHVsLCBwIHbDpMOkcnR1c3QsIG1pcyBvbiBkZWZpbmVlcml0dWQgcGlrYWFqYWxpc2Ugc2FnZWR1c2VuYSwgb24gcmFza2UgcmFrZW5kYWRhIMO8a3Npa3PDvG5kbXVzZWxlLiAKQmF5ZXNpYWFubGlrdSBwIHbDpMOkcnR1c3RlIHTDtWxnZW5kYW1pc2thbGt1bGFhdG9yaSBsZWlhdGUgYWFkcmVzc2lsdCBodHRwOi8vd3d3LmdyYXBocGFkLmNvbS9xdWlja2NhbGNzL2ludGVycHJldFBWYWx1ZTEvCgogICAgS3VqdXRsZSBtYXNzIHNwZWt0cm9za29vcGlhIGthdHNldCwga3VzIG3DtcO1ZGFtZSAyMDAwIHZhbGd1IAogICAgdGFzZW1laWQga2F0c2Uta29udHJvbGwgc2tlZW1pcyBqYSBrYXRzZXQga29ycmF0YWtzZSBuIGtvcmRhLiAKICAgIFNhZ2VkdXNsaWsgc3RhdGlzdGlrIGthc3V0YWIgYWRqdXN0ZWVyaXR1ZCBwIHbDpMOkcnR1c2kgdsO1aSBxIAogICAgdsOkw6RydHVzaSwgZXQgdMO1bW1hdGEgcGlpciwgbWlsbGVzdCDDvGhlbGUgcG9vbGUgasOkw6R2YWQgc3RhdGlzdGlsaXNlbHQgCiAgICBvbHVsaXNlZCBFUy1kIGphIHRlaXNlbGUgcG9vbGUgbWl0dGVvbHVsaXNlZCBudWxsLWVmZWt0aWQuIEVkYXNpIAogICAgdMO1bGdlbmRhYiB0YSBtaXR0ZW9sdWxpc2kgZWZla3RlIGt1aSBlYmFvbHVsaXNpIGphIGRpc2t1dGVlcmliIHZhaWQgCiAgICAib2x1bGlzaSIgZWZla3RlLiBQYXJha3UsIHAgdsOkw6RydHVzdGUgYXJ2dXRhbWluZSBqYSBhZGp1c3RlZXJpbWluZSAKICAgIHNhYWIgdG9pbXVkYSBtaXRtZWwgZXJpbmV2YWwgbW9lbCBqYSB1c2FsZHVzcGlpcmkgcGFuZWt1bGUganVzdCA5NS1sZSAKICAgIHByb3RzZW5kaWxlLCBtaXR0ZSBuw6RpdGVrcyA4OSUgdsO1aSA5OS4yJS1sZSwgcG9sZSDDvGh0ZWdpIHJhdHNpb25hYWxzZXQgCiAgICBww7VoamVuZHVzdC4gU2VlZ2EgdMO1bWJhYiB0YSBzaXN1bGlzZWx0IGp1aHVzbGlrdXMga29oYXMgam9vbmUgbMOkYmkgCiAgICBlZmVrdGlkZSwgbWlzasOkcmVsIGlnbm9yZWVyaWIga8O1aWtpIHNlbGxlc3Qgam9vbmVzdCB2YWxlbGUgcG9vbGUgasOkw6RudWQgCiAgICBlZmVrdGUuIE1lZXRvZCwgbWlzIHbDpGdhIGjDpHN0aSB0w7bDtnRhYiBwaWthYWphbGlzZXMga3ZhbGl0ZWVkaWtvbnRyb2xsaXMsIAogICAgZWkgb2xlIGthaGp1a3Mga3VpZ2kgbcO1aXN0bGlrIGthdHNlIHR1bGVtdXN0ZSDDvGtzaGFhdmFsIHTDtWxnZW5kYW1pc2VzLiAKICAgIE1pcyBqdWh0dWIsIGt1aSBvbGVtZSBrYXZhbGFkIGphIHByb292aW1lIG1pdG1laWQgZXJpbmV2YWlkIHAgCiAgICB2w6TDpHJ0dXN0ZWdhIHTDtsO2dGFtaXNlIG1lZXRvZGVpZCwgZXQgdmFsaWRhIHbDpGxqYSBzZWUgdXNhbGR1c3BpaXIsIAogICAgbWlsbGVzdCDDtWlnZWxlIHBvb2xlIGrDpMOkdmFpZCBhbmRtZWlkIG9uIHRlYWR1c2xpa3VsdCBrw7VpZ2UgcGFyZW0gCiAgICB0w7VsZ2VuZGFkYT8gRWhra2kgw7xrc2hhYXZhbCB2w7Vpc2lkIGvDtWlrIG1laWUgcG9vbHQgbMOkYmkgYXJ2dXRhdHVkIAogICAgbWVldG9kaWQgb2xsYSBsdWJhdHVkIChqYSBpc2VnaSB2w7VyZHNlbHQgaGVhZCksIGVpIGZpa3NlZXJpIHAgbsO8w7xkIGVuYW0gCiAgICB0w7zDvHAgMSB2aWdhZGUgc2FnZWR1c3QuIFNlZSB0w6RoZW5kYWIsIGV0IHAgb24ga2FvdGFudWQgZGVmaW5pdHNpb29uaWrDpHJnc2UgCiAgICB0w6RoZW5kdXNlIGphIHRlIG9sZWtzaXRlIHbDtWludWQgb2x1bGlzdXNwaWlyaSBzYW1hIGjDpHN0aSB0w7VtbWF0YSB0dW5kZSBqw6RyZ2kuCgp0w7zDvHBpbGluZSB0dWxlbXVzZSBraXJqZWxkdXMgYXJ0aWtsaXM6IAoKMS4gc2FnZWR1c2xpazogdGhlIGVmZmVjdCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IChwIDwgMC4wMSkuCgoyLiBiYXllc2lhYW5saWs6IHRoZSBtb3N0IGxpa2VseSBlZmZlY3Qgc2l6ZSBpcyBxMSAoOTAlIENJID0gcTIsIHEzKSBhbmQgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHRydWUgZWZmZWN0IGlzIDwgMCBpcyBxNCBwZXJjZW50LiAKCjkwJSBDSSAtLS0gY3JlZGlibGUgaW50ZXJ2YWwgLS0tIHTDpGhlbmRhYiwgZXQgbWUgb2xlbWUgOTAlIGtpbmRsYWQsIGV0IHRlZ2VsaWsgZWZla3RpIHN1dXJ1cyBhc3ViIHZhaGVtaWt1cyBxMiAuLi4gcTMuIAoKIyMjIDIuMS4yLmthaGUgcGFyYWRpZ21hIGVyaW5ldnVzZWQgCgoxLiBzYWdlZHVzbGlrdXMgc3RhdGlzdGlrYXMgdsO1cmR1YiBwdW5rdC1oaW5uYW5nIHRlZ2VsaWt1bGUgZWZla3RpIHN1dXJ1c2VsZSB2YWxpbWkga2Vza21pc2UgRVMtZ2EuIEJheWVzaSBzdGF0aXN0aWthcyBzZWUgc2FnZWxpIG5paSBlaSBvbGUsIHNlc3QgdGF1c3RhdGVhZG1pc3RlIG11ZGVsIG3DtWp1dGFiIHNlZGEgaGlubmFuZ3V0LiBQYWxqdWQgbXVkZWxpZCBww7zDvGF2YWQgZWtzdHJlZW1zZWlkIHZhbGltZWlkIHRhdXN0YXRlYWRtaXN0ZSBhYmlsIHZlaWRpIG3DtWlzdGxpa3VzIHN1dW5hcyBuaWh1dGFkYSwgbmlpdmlpc2kgdsOkaGVuZGFkZXMgw7xsZXBhaXN1dGF0dWQgZWZla3RpZGUgYXZhbGRhbWlzZSBvaHR1LgoKMi4gc2FnZWR1c2xpayBzdGF0aXN0aWthIHTDtsO2dGFiIHTDpG51IHNlbGxlbGUsIGV0IHV1cmlqYSB2w7V0YWIgdmFzdHUgcGx1c3MtbWlpbnVzIG90c3VzZWlkOiBpZ2EgSDAga2FzIGzDvGthdGFrc2Ugw7xtYmVyIHbDtWkgasOkZXRha3NlIGtlaHRpbWEuIFNlZXZhc3R1IGJheWVzaWFhbiBtw7V0bGViIGhhbGxpIHZhcmp1bmRpdGVzOiBzaXNzZXR1bGV2YWQgYW5kbWVkIGthcyBzdXVyZW5kYXZhZCB2w7VpIHbDpGhlbmRhdmFkIGjDvHBvdGVlc2lkZSB0w7VlbsOkb3N1c2kgKG1pcyBqw6TDpHZhZCBhZ2EgYWxhdGkgPiAwIGphIDwgMSkuCgozLiBwIHbDpMOkcnR1c2VkIGtvbnRyb2xsaXZhZCB0w7zDvHAgMSB2aWdhZGUgc2FnZWR1c3QgYWludWx0IHNpaXMsIGt1aSBrYXRzZSBkaXNhaW5pIGphIGhpbGlzZW1hIHR1bGVtdXN0ZSBhbmFsw7zDvHNpIGRldGFpbGlkIG9uIGVubmUga2F0c2Ugc29vcml0YW1pc3QgasOkaWdhbHQgZmlrc2Vlcml0dWQgKHbDtWkgZWVsbmV2YWx0IG9uIHTDpHBzZWx0IHBhaWthIHBhbmR1ZCBsdWJhdHVkIHZhcmlhdHNpb29uaWQga2F0c2UtIGphIGFuYWzDvMO8c2kgcHJvdG9rb2xsaXMpLiBFZWxrw7VpZ2UgdMOkaGVuZGFiIHNlZSwgZXQgdmFsaW1pIHN1dXJ1cyBqYSBrYXN1dGF0YXZhZCBzdGF0aXN0aWxpbnNlZCB0ZXN0aWQgcGVhdmFkIG9sZW1hIGVlbG5ldmFsdCBmaWtzZWVyaXR1ZC4gVMO8w7xwaWxpc2VsdCBzYWFtZSBwIHbDpMOkcnR1c2UgYXJ2dXRhZGEgdmFpZCDDvGtzIGtvcmQgamEga3VpIHAgPSAwLjA1MSwgc2lpcyBvbGVtZSBzdW5uaXR1ZCBIMCBwYWlrYSBqw6R0bWEgbmluZyBlZmVrdGkgZGVrbGFyZWVyaW1pc2VzdCBsb29idW1hLiBNZSBlaSBzYWEgbGlodHNhbHQga2F0c2V0IGp1dXJkZSB0ZWhhLCBldCB2YWFkYXRhLCBtaXMganVodHViLiBCYXllc2lhYW4gc2VldmFzdHUgdsO1aWIgb21hIHBvc3Rlcmlvb3JzZSB0w7VlbsOkb3N1c2UgYXJ2dXRhZGEga2FzdsO1aSBww6RyYXN0IGlnYSBrYXRzZXB1bmt0aSBrb2d1bWlzdCBuaW5nIGthdHNlIHBlYXRhZGEga29oZSAodsO1aSBhbGxlcyBzaWlzKSwga3VpIHRhIGxlaWFiLCBldCB0ZW1hIHBvc3Rlcmlvb3JuZSBqYW90dXMgb24gcGlpc2F2YWx0IGtpdHNhcywgZXQgdGVhZHVzbGlra3UgaHV2aSBwYWtrdWRhLgoKNC4gc2FnZWR1c2xpa3Ugc3RhdGlzdGlrYSBwbHVzcy1taWludXMgaXNlbG9vbSB0aW5naWIgc2VsbGUsIGV0IGt1aSB0ZWdlbGlrIGVmZWt0aSBzdXVydXMgb24gbGlpZ2EgdsOkaWtlLCBldCBzYXR0dWRhIMO1aWdlbGUgcG9vbGUgb2x1bGlzdXNuaXZvb2QsIHNpaXMgYW5uYXZhZCBzdGF0aXN0aWxpc2VsdCBvbHVsaXNpIHR1bGVtdXNpIMO8bGVwYWlzdXRhdHVkIGVmZWt0aWQsIG1pZGEgdGVraWIgdMOkbnUgdmFsaW1pdmVhbGUuIE5paSBzYWFiIHPDvHN0ZW1hYXRpbGlzZWx0IGthbGx1dGF0dWQgdGVhZHVzZS4gQmF5ZXNpIHN0YXRpc3Rpa2FzIHNlZGEgcHJvYmxlZW1pIGVpIGVzaW5lLCBrdW5hIG90c3VzZWQgZWkgb2xlIHBsdXNzLW1paW51cyB0w7zDvHBpLgoKNS4gYmF5ZXNpIHN0YXRpc3Rpa2EgZWkgZmlrc2VlcmkgdMO8w7xwIDEgdmlnYWRlIHNhZ2VkdXN0LiBTZWUtZWVzdCB2w7VpdGxlYiBzZWUgbm4gdmFsZWjDpGlyZXRlIHZhc3R1LCBtaWxsZWtzIGthYXNhamFsIGthc3V0YXRha3NlIGVuaW0gaGllcmFyaGlsaXNpIHNocmlua2FnZSBtdWRlbGVpZC4gU2VlIG9uIGJheWVzaSB2YXN0ZSBzYWdlZHVzbGlrdXMgc3RhdGlzdGlrYXMga2FzdXRhdGF2YXRlbGUgbXVsdGlwbGUgdGVzdGluZ3Uga29ycmVrdHNpb29uaWRlbGUuIEt1aSBzYWdlZHVzbGlrIHN0YXRpc3RpayB2w7VpdGxlYiB2YWxlaMOkaXJldGVnYSBwIHbDpMOkcnR1c2kgYWRqdXN0ZWVyaWRlcyBqYSBzZWxsZSBsw6RiaSBvbHVsaXN1c25pdm9vZCBuaWh1dGFkZXMsIHNpaXMgYmF5ZXNpYWFuIGthc3V0YWIgc2hyaW5rYWdlIG11ZGVsaXQsIGV0IHBhcmFuZGFkYSBoaW5uYW5ndWlkIMO8a3Npa3V0ZSBlZmVrdGlkZSBrZXNrdsOkw6RydHVzdGVsZSBqYSBuZW5kZSBzZC1sZSwga2FzdXRhZGVzIHBhaW5kbGlrdWx0IGtvZ3UgYW5kbWVzZXRpcyBsZWlkdXZhdCBpbmZvdC4KClNlZSBvbiBrw7VpaywgbWlkYSBtZSBzYWdlZHVzbGlrdSBzdGF0aXN0aWthIGtvaHRhIMO8dGxlbWUuIE1pdHRlIG1pc2tpLCBtaXMgasOkcmduZWIsIGVpIGVlbGRhIHNhZ2VkdXNsaWt1IHBhcmFkaWdtYSB0dW5kbWlzdC4KCiMjIDIuMiBTdXVyIGphIHbDpGlrZSBtYWFpbG0KCkFuZG1lYW5hbMO8w7xzIGphIHN0YXRpc3Rpa2EgKHNpaW4gc8O8bm9uw7zDvG1pZCkgb24gbGFodXRhbWF0dSBvc2EgaWdhc3QgbG9vZHVzdGVhZHVzZXN0LiBKw6RyZ25ldmFsdCBzZWxldGFuLCBtaWtzLgoKS3VuYSBtYWFpbG0gb24gbGlpZ2Egc3V1ciBqYSBrZWVydWxpbmUsIGV0IHNlZGEgb3RzZSB1dXJpZGEsIGzDtWlrYXZhZCB0ZWFkbGFzZWQgc2VsbGUgdsOkaWtzZW1hdGVrcyB0w7xra2lkZWtzLCBrYXN1dGFkZXMgdG9yZGlsYWJpZGFuYSB0ZWFkdXNsaWtlIGjDvHBvdGVlc2UuIFTDvMO8cGlsaW5lIGjDvHBvdGVlcyBwYWt1YiB2w6RsamEgbWl0dGVtYXRlbWFhdGlsaXNlIHNlbGV0dXNlIG3DtW5lbGUga2l0c2FsdCBwaWlyaXRsZXR1ZCBsb29kdXNuw6RodHVzZWxlLiBOw6RpdGVrcyBkYXJ2aW5pc3RsaWsgZXZvbHV0c2lvb25pdGVvb3JpYSBww7zDvGFiIHNlbGV0YWRhIGV2b2x1dHNpb29uaSB0b2ltZW1laGhhbmlzbWUuIFNlZGEgdGVvb3JpYXQgdsO1aWIgdsO1cnJlbGRhIGVtcGlpcmlsaXN0ZSBhbmRtZXRlZ2EuIAoKTWlzIGp1aHR1Yiwga3VpIHRlaWUgbGVtbWlraMO8cG90ZWVzIG9uIGFuZG1ldGVnYSBrb29za8O1bGFzPyBLYXMgc2VlIHTDpGhlbmRhYiwgZXQgc2VlIGjDvHBvdGVlcyBvbiB0w7VlbmU/IFbDtWksIGV0IHNlZSBvbiB0w7VlbsOkb2xpc2VsdCB0w7VlbmU/IEthaGp1a3Mgb24gdmFzdHVzIG3DtWxlbWFsZSBrw7xzaW11c2VsZSBlaXRhdi4gUMO1aGp1c2VrcyBvbiBhc2phb2x1LCBldCBlbmFtYXN0aSBsZWlhYiBpZ2EgbsOkaHR1c2Ugc2VsZXRhbWlzZWtzIHJvaGtlbSBrdWkgw7xoZSBhbHRlcm5hdGlpdnNlIHRlYWR1c2xpa3UgaMO8cG90ZWVzaSAobsOkaXQuIGxhbWFya3Npc3RsaWsgZXZvbHV0c2lvb25pdGVvb3JpYSkgbmluZyByb2hrZW0ga3VpIMO8a3Mgw7xrc3RlaXN0IHbDpGxpc3RhdiBow7xwb3RlZXMgdsO1aWIgb2xsYSBvbGVtYXNvbGV2YXRlIGFuZG1ldGVnYSB2w7VyZHNlcyBrb29za8O1bGFzLiBBc2phIHRlZWIgdmVlbCBodWxsZW1ha3MsIGV0IHRlb3JlZXRpbGlzZWx0IG9uIHbDtWltYWxpayBzw7VuYXN0YWRhIGzDtXBtYXR1bHQgcGFsanUgZXJpbmV2YWlkIHRlb29yaWFpZCwgbWlzIGvDtWlrIHBha3V2YWQgYWx0ZXJuYXRpaXZzZWlkIGphIMO8a3N0ZWlzdCB2w6RsaXN0YXZhaWQgc2VsZXR1c2kgc2FtYWxlIG7DpGh0dXNlbGUuIAoKT2xndSBwZWFsZSwga3VpIG1lIHZhYXRhbWUgbWFhaWxtYSBrw7Vpa2V0ZWFkamEganVtYWxhIHBlcnNwZWt0aWl2aXN0LCBzaWlzIHRlbWEgdsO1aWIgdmFhZGVsZGEga8O1aWtlaMO1bG1hdmEgdMO1ZW5kdXNtYXRlcmphbGkgc29iaXZ1c3Qga8O1aWdpIHbDtWltYWxpa2UgdGVvb3JpYXRlZ2EgbmluZyB2YWxpZGEgdsOkbGphIHNlbGxlIGFpbnNhIHRlb29yaWEsIG1pcyBrw7VpZ2UgcGFyZW1pbmkgdMO1ZW5kdXNtYXRlcmphbGlnYSBzb2JpYi4gS3VpZ2ksIHNlZSBlZWxkYWtzLCBldCB0YWwgb24gbMO1cG1hdGEgcGFsanUgYW5kbWVpZCwgc2VzdCBtdWlkdSBlaSBvbGVrcyB0YWwgbG9vZ2lsaXNlbHQgdsO1aW1hbGlrIGzDtXBtYXRhIHBhbGp1ZGUgdGVvb3JpYXRlIHZhaGVsIHZhbGlkYSAtIGFnYSBqdW1hbGEgamFva3Mgb24ga8O1aWsgdsO1aW1hbGlrLiBJZ2FsIGp1aHVsIG1laWUsIHN1cmVsaWtlLCBqYW9rcyB0w6RoZW5kYWIgc2VlLCBldCB0ZWFkdXNsaWt1cyAiZmFrdGlzIiBzYWFiIGFsYXRpIGthaGVsZGEsIHNlc3Qga3VuYWdpIGVpIHbDtWkga2luZGVsIG9sbGEsIGV0IHBhcmltYWQgdGVvb3JpYWQgbMO1cG1hdGEgc3V1cmVzdCB0ZW9vcmlhcGlsdmVzdCBlaSBvbGUgbWVpbCB0w6RpZXN0aSB0w6RoZWxlcGFudXRhIGrDpMOkbnVkIG5pbmcsIGV0IG1laWUgamFva3MgZWtzaXN0ZWVyaXZhZCBhbmRtZWQga2FqYXN0YWtzaWQgaMOkc3RpIGvDtWlraSB2w7VpbWFsaWtrZSBhbmRtZWlkLiBPbiBzZWxnZSBuYWd1IHNlZWJpdmVzaSwgZXQgbWlkYSB2w6RoZW0gYWVnYSBtZSBrdWx1dGFtZSB0ZW9vcmlhbG9vbWVrcyBqYSBhbmRtZXRlIGtvZ3VtaXNla3MsIHNlZGEgdsOkaGVtIHVzdXRhdmFkIG9uIGthIG1laWUgdGVhZHVzbGlrdWQgasOkcmVsZHVzZWQuIFNhZ2VsaSBvbiBuaWksIGV0IG1pZGEga2VodmVtIG9uIG9sdWtvcmQgYW5kbWVyaW5kZWwsIHNlZGEgcm9oa2VtIHZhamFtZSBzdGF0aXN0aWthdC4gS3VpIG1laWwgw7VubmVzdHVrcyBvbWEgYW5kbWV0ZXN0IGlsbWEgc3RhdGlzdGlrYXRhIHNhaWEgdGVoYSwgZWkga8O1aGtsZWtzIG1lIGhldGtlZ2khIEVyaXRpLCBrdW5hIHN0YXRpc3Rpa2FnYSBrw6RpdmFkIGvDpHNpa8OkZXMgc3RhdGlzdGlsaXNlZCBtdWRlbGlkLiAgICAgICAgIAoKIyMgMi4yLjEgTXVkZWxpIHbDpGlrZSBtYWFpbG0KCiAgw5xsYWxtYWluaXR1ZCB0ZWFkdXNsaWt1IG1lZXRvZGkgcHV1ZHVzZWQgdGluZ2l2YWQsIGV0IG1laWUgaHV2aWRlcyBvbiBvbWEgdGVhZHVzbGlra2UgcHJvYmxlZW1lIHZlZWwgw7xoZSB0YXNlbWUgdsO1cnJhIGxpaHRzdXN0YWRhLCB0YWFuZGFkZXMgbmVlZCBzdGF0aXN0aWxpc3Rla3MgcHJvYmxlZW1pZGVrcy4gU2VsbGVrcyB0dWxldGFtZSBtZSB0YXZha2VlbHNlc3QgamEgbGFpYWhhYXJkZWxpc2VzdCB0ZWFkdXNsaWt1c3QgdGVvb3JpYXN0IHTDpHBzZWx0IGZvcm11bGVlcml0dWQgbWF0ZW1hYXRpbGlzZSBtdWRlbGkgbmluZyBzZWVqw6RyZWwgYXN1bWUgdXVyaW1hIG9tYSBtdWRlbGl0LiAKICAKICBNdWRlbGkgbWFhaWxtIGVyaW5lYiBww6RyaXMgbWFhaWxtYXN0IHNlbGxlIHBvb2xlc3QsIGV0IG11ZGVsaSBtYWFpbG1hcyBvbiBrw7Vpa3bDtWltYWxpa3VkIHPDvG5kbXVzZWQsIG1pcyBww7VoaW3DtXR0ZWxpc2VsdCB2w7VpdmFkIGp1aHR1ZGEsIGp1YmEgZXR0ZSB0ZWFkYSBqYSDDvGxlcyBsb2V0dWQgKHNlZGEgc8O8bmRtdXN0ZSBrb2d1IGt1dHN1dGFrc2UgcGFyYW1lZXRyaXJ1dW1pa3MpLiBTZWVnYSwgdGVobmlsaXNlbHQgb24gbXVkZWxpIG1hYWlsbWFzIMO8bGxhdHVzZWQgdsO1aW1hdHVkLgogIAogIE11ZGVsaSBlZWxpc2VrcyB0ZW9vcmlhIGVlcyBvbiwgZXQgaMOkc3RpIGtvbnN0cnVlZXJpdHVkIG11ZGVsIG9uIGxpaHRzYW1pbmkgbcO1aXN0ZXRhdiAtLS0gZXJpbmV2YWx0IHbDpGhlZ2kga2VlcnVsaXNlbWFzdCB0ZWFkdXNsaWt1c3QgaMO8cG90ZWVzaXN0IG9uIG11ZGVsaSBlZWxkdXNlZCBqYSBlbm51c3R1c2VkIGzDpGJpbsOkaHRhdmFkIGphIHTDpHBzZWx0IGZvcm11bGVlcml0YXZhZC4gTXVkZWxpIHB1dWR1c2VrcyBvbiBhZ2EsIGV0IGVyaW5ldmFsdCB0ZW9vcmlhc3QgZWkgb2xlIG1pbmdpdCB2w7VpbWFsdXN0LCBldCBtdWRlbCB2YXN0YWtzIHRlZ2VsaWtrdXNlbGUgZWhrIG9sZWtzIHTDtWVuZS4gU2VkYSBzZWxsZXDDpHJhc3QsIGV0IG11ZGVsIG9uIHRhb3RsdXNsaWt1bHQgbGlodHN1c3RhdiAoZXJhbmRpa3Mgb24gcHVodGFsdCBlbm51c3R1c2xpa3VkIG11ZGVsaWQsIG1pcyBvbiBhZ2EgZW5hbWFzdGkgbMOkYmluw6RodGFtYXR1IHN0cnVrdHV1cmlnYSkuIE11ZGVsIG9uIGthcyBrYXN1bGlrIHbDtWkga2FzdXR1OyB0ZW9vcmlhIG9uIGthcyB0w7VlbmUgdsO1aSB2w6TDpHIuIE11ZGVsaSBqYSBtYWFpbG1hIHZhaGVsIHbDtWliIG9sbGEga2F1ZG5lICJwZWVnZWxkdXMiLCBhZ2EgbWl0dGUga3VuYWdpIG90c2VuZSBzaWRlLiBTZWVnYSwgw7xrc2tpIG51bWJlciwgbWlzIGFydnV0YXRha3NlIG11ZGVsaSByYWFtZXMsIGVpIGthbmR1IHNhbWEgbnVtYnJpbmEgw7xsZSB0ZWFkdXNsaWtrdSBlZ2EgcMOkcmlzIG1hYWlsbWEuIEphIGtvZ3Ugc3RhdGlzdGlrYSAoa2EgbWl0dGVwYXJhbWVldHJpbGluZSkgdG9pbXViIG11ZGVsaSB2w6Rpa3NlcyBtYWFpbG1hcy4gQXJ2dWQsIG1pZGEgc3RhdGlzdGlrYSB0ZWlsZSBwYWt1YiwgZWxhdmFkIG11ZGVsaSBtYWFpbG1hczsgc2FtYXMga3VpIHRlaWUgdGVhZHVzbGlrIGh1dmkgb24gc3V1bmF0dWQgcMOkcmlzIG1hYWlsbWFsZS4gTsOkaXRla3MgOTUlIHVzYWxkdXNpbnRlcnZhbGwgZWkgdMOkaGVuZGEsIGV0IHRlIHBlYWtzaXRlIG9sZW1hIDk1JSBraW5kZWwsIGV0IHTDtWRlIGFzdWIgc2VsbGVzIGludGVydmFsbGlzIOKAkyBzYWdlbGkgZWkgdG9oaWtzIHRlIHNlZGEgbmlpIGp1bGdlbHQgdMO1bGdlbmRhZGEgaXNlZ2kga2l0c2FzIG11ZGVsaSBtYWFpbG1hcy4gCiAgCiMjIyMgMi4yLjIuIE7DpGlkZTogQXJpc3RvdGVsZXMsIFB0b2xlbWFpb3MgamEgS29wZXJuaWt1cwoKQXJpc3RvdGVsZXMgbMO1aSB0ZW9vcmlhIG1hYWlsbWEgdG9pbWltaXNlIGtvaHRhLCBtaXMgZG9taW5lZXJpcyBoYXJpdHVkIEV1cm9vcGxhc2UgbWFhaWxtYXBpbHRpIGVuYW0ga3VpIDEyMDAgYWFzdGEgdsOkbHRlbC4gU2VsbGUga29oYXNlbHQgYXN1YiB1bml2ZXJzdW1pIGtlc2twdW5rdGlzIG1hYWtlcmEgbmluZyBrw7VpaywgbWlkYSBzaWluIGxlaWRhIHbDtWliLCBvbiB0ZWh0dWQgbmVsamFzdCBlbGVtZW5kaXN0OiBtYWEsIHZlc2ksIMO1aGsgamEgdHVsaS4gU2FtYXMsIGtvZ3UgbWFhaWxtYXJ1dW0gYWxhdGVzIGt1dSBzZsOkw6RyaXN0IG9uIHRlaHR1ZCB2aWllbmRhc3QgZWxlbWVuZGlzdCAoZWV0ZXIpLCBtaWRhIGFnYSBlaSBsZWlkdSBtYWFsIChuYWd1IG5lbGphIGVsZW1lbnRpIGVpIGxlaWR1IGt1dSBwZWFsIGphIHNlYWx0IGVkYXNpKS4gVGFldmFrZWhhZCAoa3V1LCBww6Rpa2UsIHBsYW5lZWRpZCBqYSBraW5uaXN0w6RoZWQpIHRpaXJsZXZhZCDDvG1iZXIgbWFhIGtvbnRzZW50cmlsaXN0ZXMgc2bDpMOkcmlkZXMsIG1pcyBvbiBvbWF2YWhlbCBzZW90dWQgKG1pbGxlIHZhaGVsIHBvbGUgdmFiYSBydXVtaSkuIFNlZWdhIG9uIGtvZ3UgbGlpa3VtaW5lIGVldHJpIHNmw6TDpHJpZGVzIMO8aHRsYW5lIGphIHJpbmdpa3VqdWxpbmUgamEgc2VlIGxpaWt1bWluZSBww7VoanVzdGFiIHBpa2EgcMO1aGp1cy10YWdhasOkcmcgYWhlbGEga2F1ZHUga8O1aWtpIGxpaWt1bWlzaSwgbWlkYSBtYWFwZWFsIGtvaHRhbWUuIEthYXNhIGFydmF0dWQgbWVpZSBzw7xuZGltaW5lLCBlbHVrw6RpayBqYSBzdXJtIChtaXMgb24ga8O1aWsgbGlpa3VtaXNlZCkuIEvDtWlrLCBtaXMgbWFhcGVhbCBodXZpdGF2YXQsIGVoayBrb2d1IGxpaWt1bWluZSwgb24gYWxnc2VsdCBww7VoanVzdGF0dWQgZXNpbWVzZSBsaWlrdW1pc2UgcG9vbHQsIG1pbGxlIGvDpGl2aXRhYiBrw7VpZ2UgdsOkbGltaXNlcyBzZsOkw6RyaXMgcGFpa25ldiBtZWllIGphb2tzIG3DtWlzdGV0YW1hdHUgaW50ZWxsZWt0aWdhICJvbGVuZCIuICAKCkFyaXN0b3RlbGVzZSBzdXVyIHRlb29yaWEgw7xoZW5kYWIga29ndSBtYWFpbG1hcGlsZGkgYWxhdGVzIGthYXNhZWdzZXMgbcO1aXN0ZXMga2VlbWlhc3QgamEga29zbW9sb29naWFzdCBrdW5pIGJpb2xvb2dpYSwgbWFhdGVhZHVzZSBqYSBpc2VnaSBnZW9ncmFhZmlhbmkuIFNlbGxpc2VkIMO8aGVuZHRlb29yaWFkIG9uIG5hZ3UgNTAwIGFhc3Rhc2VkIHNla3ZvaWFkOyBuYWQgb24gcmFza2VkIGxhbmdldGFkYSwgYWdhIGt1aSBtw7VuaSBzaWlza2kga3VrdWIsIGtvc3RhYiByYWdpbiBrYXVnZWxlLiBTYW1hcywgw7xodGUgQXJpc3RvdGVsZXNlIGtvc21vbG9vZ2lhIG9sdWxpc3QgcHV1ZHVzdCBuw6RodGkga29oZS4gTmltZWx0IGVpIHN1dWRhIEFyaXN0b3RlbGVzIHNlbGV0YWRhLCBtaWtzIG9zYWQgcGxhbmVlZGlkIHRlYXZhdsO1bHZpbCB2YWhlc3Qgc3V1bmRhIG11dWRhdmFkIGphIG3DtW5kYSBhZWdhIGxhdXNhIHZhc3R1cGlkaXNlcyBzdXVuYXMgbGlpZ3V2YWQgKHJldHJvZ3Jlc3Npb29uKS4gS3VuYSBhc3Ryb25vb21pYSBww7VoaWxpbmUga2FzdXR1c2FsYSBvbGkgYXN0cm9sb29naWEsIHNpaXMgcMO1w7VyYXRpIHBsYW5lZXRpZGUgbGlpa3VtaXNlbGUgc3V1cnQgdMOkaGVsZXBhbnUuIExhaGVuZHVzZWtzIGVpIG9sbnVkIGFnYSBtaXR0ZSBzdXVyZSB0ZW9vcmlhIMO8bWJlcnRlZ2VtaW5lIHbDtWkgw7xtYmVybMO8a2thbWluZSwgdmFpZCBuw7V1ZGx1cyB1dWUgdGVhZHVzZSBqw6RyZWxlLCBtaXMgInDDpMOkc3Rha3MgZmVub21lbmlkIi4gU2lpbiB0dWxpIGFwcGkgUHRvbGVtYWlvcywga2VzIGzDtWkgbWF0ZW1hYXRpbGlzZSBtdWRlbGksIGt1cyBwbGFuZWVkaWQgbWl0dGUgbGlodHNhbHQgZWkgbGlpZ3UgcmluZ3RyYWpla3Rvb3JpIG3DtcO1ZGEgdmFpZCBzYW1hbCBhamFsIHRlZXZhZCBrYSB2w6Rpa3NlbWFpZCByaW5nZSDDvG1iZXIgZXNpbWVzZSBzdXVyZSByaW5nam9vbmUuIE5laWQgdsOkaWtzZW1haWQgcmluZ2Uga3V0c3V0YWtzZSBlcGl0c8O8a2xpdGVrcy4gU2VlIG11ZGVsIHN1dXRpcyBwbGFuZWV0aWRlIGxpaWt1bWlzdCB0YWV2YXbDtWx2aWwgcGlpc2F2YWx0IGjDpHN0aSBlbm51c3RhZGEsIGV0IGFzdHJvbG9vZ2lkZSBuw7V1ZGxpayBzZWx0c2tvbmQgc2VsbGVnYSByYWh1bGUgasOkaS4gCgpQdG9sZW1haW9zZWwgamEgdGVtYSBqw6RyZ2lqYXRlbCBvbGkgdGVnZWxpa3VsdCBtaXR1IGVyaW5ldmF0IG11ZGVsaXQuIE9zYWQgbmVpc3QgZWkgc2lhbGRhbnVkIGVwaXRzw7xrbGVpZCBqYSBtYWFrZXJhIGVpIGFzdW51ZCB0ZW1hIG11ZGVsaXRlcyB1bml2ZXJzdW1pIGtlc2tlbCwgdmFpZCBvbGkgc2VsbGVzdCBwdW5rdGlzdCBlZW1hbGUgbmlodXRhdHVkIC0tLSBuaWkgZXQgcMOkaWtlIGVpIHRlaW51ZCByaW5nZSDDvG1iZXIgbWFha2VyYSB2YWlkIMO8bWJlciB0w7xoamEgcHVua3RpLiBPbiBvbHVsaW5lLCBldCBsZWlkdXMgZXBpdHPDvGtsaXRlZ2EgbXVkZWwgamEgaWxtYSBlcGl0c8O8a2xpdGV0YSBtdWRlbCwgbWlzIG9saWQgbWF0ZW1hYXRpbGlzZWx0IGVrdml2YWxlbnRzZWQgamEgc2VlZ2EgYW5kc2lkIHbDtXJkc2VpZCBlbm51c3R1c2kuIE9saSBzZWxnZSwgZXQgQXJpc3RvdGVsZXNlIHRlb29yaWEgamEgZmVub21lbmlkZSBww6TDpHN0bWlzZSBtdWRlbGlkIG9saWQgZnVuZGFtZW50YWFsc2VsdCBlcmluZXZhZCBhc2phZC4gU2FtYWwgYWphbCBrdWkgQXJpdG90ZWxlcyAqKnNlbGV0YXMqKiBtYWFpbG1hIHDDtWhpb2xlbXVzdCBww7VoanVzbGlrZSBzZW9zdGUgamFkYW5hIChtaXR0ZSBtYXRlbWFhdGlsaXNlbHQpLCAqKmtpcmplbGRhcy9lbm51c3RhcyoqIFB0b2xlbWFpb3Mgc2VsbGVzYW1hIG1hYWlsbWEga8OkaXR1bWlzdCBtYXRlbWFhdGlsaXN0ZSAobWl0dGUgcMO1aGp1c2xpa2UpIHN0cnVrdHV1cmlkZSBhYmlsLgoKTmlpIHRla2tpcyBvbHVrb3JkLCBrdXMgbWFhaWxtYSBtw7Vpc3RtaXNla3Mga2FzdXRhdGkgMTAwMCBhYXN0YSB2w6RsdGVsIEFyaXN0b3RlbGVzZSDDvGhlbmR0ZW9vcmlhdCBhZ2Egc2VsbGUga2lyamVsZGFtaXNla3MgamEgdHVsZXZpa3UgZW5udXN0YW1pc2VrcyBob29waXMgcHRvbGVtYWlsaXNpIG11ZGVsZWlkLCBtaWRhIGtlZWdpIHDDpHJpc2VsdCB0w7Vla3MgZWkgcGlkYW51ZCBqYSBtaWRhIGhpbm5hdGkgc2VsbGUgasOkcmdpLCBrdWkgaMOkc3RpIG5lZWQgInDDpMOkc3RzaWQgZmVub21lbmUiLiAKClNlZSB0b29iIG1laWQgS29wZXJuaWt1IGp1dXJkZSwga2VzIHRlYWR1c2FqYWxvb2xhc3RlIGFydmF0ZXMgdmFsbGFuZGFzIDE3LiBzYWphbmRpIHRlYWR1c2xpa3UgcmV2b2x1dHNpb29uaSBhdmFsZGFkZXMgcmFhbWF0dSwga3VzIHRhIGFzZXRhYiBww6Rpa2VzZSB1bml2ZXJzdW1pIGtlc2tlbGUgamEgcGFuZWIgbWFhIHNlbGxlIMO8bWJlciByaW5ndHJhamVrdG9vcmlsIHRpaXJsZW1hLiBLYXMgS29wZXJuaWt1cyB0w7VyanVzIHNlbGxlZ2Ega8O1cnZhbGUgQXJpc3RvdGVsZXNlLCBQdG9sZW1haW9zZSB2w7VpIG3DtWxlbWFkPyBLYWFzYWVnbmUgc2Vpc3Vrb2h0IG9uLCBldCBrdWlnaSBLb3Blcm5pa3VzIHNvb3ZpcyB0ZWhhIGtvbG1hbmRhdCwgYXJ2YXNpZCB0ZW1hIHLDpG5nYWx0IG1hdGVtYWF0aWxpc2UgdGVvc2UgYXZhbGRhbWlzZWxlIGrDpHJnbmVudWQgNDAgYWFzdGEgdsOkbHRlbCBwZWEga8O1aWsgYXNqYXR1bmRsaWt1ZCBhc3Ryb25vb21pZCwgZXQgdGEgc29vdmlzIHbDpGxqYSBwYWtrdWRhIHZhaWQgbGlodHNhbWEgYWx0ZXJuYXRpaXZpIGVwaXRzw7xrbGl0ZWdhIG11ZGVsaWxlLCBtaXMgc2VsbGVrcyBhamFrcyBvbGkgbXV1dHVudWQgdsOkZ2Ega2VlcnVrYWtzIChhZ2Ega2Egc2FtYXbDtXJyYSBlbm51c3R1c3TDpHBzZWtzKS4gS3VuYSBLb3Blcm5pa3VzZSByYWFtYXQgbMOka3MgdHLDvGtraSBhamFsLCBtaWwgc2VsbGUgYXV0b3Igb2xpIGp1YmEgc3VyaXZvb2RpbCwga2lyanV0YXMgc2VsbGVsZSBlZXNzw7VuYSDDvGtzIHRlbWEgdmFpbXVsaWt1c3Qgc8O1YmVyLCBrZXMgcMO8w7xkaXMgb29kYXRhdmF0IGtpcmlrbGlra3UgcGFoYW1lZWx0IGxlZXZlbmRhZGEgc3VnZXJlZXJpZGVzLCBldCBww6Rpa2VzZSBrZXNrZWxlIHZpaW1pbmUgZWkgb2xlIG11dWQga3VpIG11ZGVsZGFtaXNlIHRyaWtrLCBtaWxsZXN0IGVpIHRhc3UgasOkcmVsZGFkYSwgZXQgbWFha2VyYSBrYSB0ZWdlbGlrdWx0IMO8bWJlciBww6Rpa2VzZSB0aWlybGViIChwaWliZWwgcsOkw6RnaWIsIGt1aWRhcyBqdW1hbCBwZWF0YXMgdGFldmF2w7VsdmlsIHDDpGlrZXNlLCBtaXR0ZSBtYWEpLiBKYSBrdW5hIGVlc3PDtW5hIG9saSBhbm9uw7zDvG1uZSwgZWVsZGFzaWQgbHVnZWphZCBtdWlkdWdpLCBldCBzZWxsZSBraXJqdXRhcyBhdXRvci4gTGlzYWtzLCBrdWlnaSBLb3Blcm5pa3VzIHTDtXN0aXMgcMOkaWtlc2Uga2Vza2VsZSwgasOkaSB0YSByaW5naWt1anVsaXN0ZSB0cmFqZWt0b29yaWRlIGp1dXJkZSwgbWlzIHTDpGhlbmRhcywgZXQgc2VsbGVrcywgZXQgdGVtYSBtdWRlbCBmZW5vbWVuaWRlIHDDpMOkc3RtaXNlbCBow6R0dGEgZWkgasOkw6RrcyBqYSBhc3Ryb2xvb2dpZGVsZSBrYXN1dHUgZWkgb2xla3MsIG9saSB0YSBzdW5uaXR1ZCBtYWFkIGphIHBsYW5lZXRlIGxpaWd1dGFtYSDDvG1iZXIgcMOkaWtlc2UgbcO1w7VkYSBlcGl0c8O8a2xlaWQuIEtva2t1dsO1dHRlcyBvbGkgS29wZXJuaWt1IG11ZGVsIHNhbWEga2VlcnVsaW5lIGt1aSBQdG9sZW1haW9zZSBzdGFuZGFyZG11ZGVsIChuZWlzIG9saSB2w7VyZG5lIGFydiBlcGl0c8O8a2xlaWQpIGphIHNlbGxlIGFiaWwgdGVodHVkIGVubnVzdHVzZWQgcGxhbmVldGlkZSBsaWlrdW1pc2Uga29odGEgb2xpZCB2w6Rpa3NlbWEgdMOkcHN1c2VnYS4gCgogICAgICBLb3Blcm5pa3UgbXVkZWwgc3V1dGlzIHNhbWFzIGVubnVzdGFkYSBtw7VuaW5nYWlkIG7DpGh0dXNpIChwbGFuZWV0aWRlIG7DpGl2CiAgICAgIGhlbGVkdXMgbXV1dHViIG5pbmcgasO1dWFiIG1ha3NpbXVtaSBuZW5kZSBsw6RoaW1hcyBhc3Vrb2hhcyBtYWFsZSksIG1pZGEKICAgICAgUHRvbGVtYWlvc2UgbXVkZWwgZWkgZW5udXN0YW51ZC4gU2VlIGVpIHTDpGhlbmRhLCBldCBuZWVkIGZlbm9tZW5pZCBvbGVrc2lkCiAgICAgIG9sbnVkIHZhc3R1b2x1cyBQdG9sZW1haW9zZSBtdWRlbGlnYS4gTGlodHNhbHQsIG5lbmRlIFB0b2xlbWFpb3NlIG11ZGVsaXNzZQogICAgICBzb2JpdGFtaXNla3Mgb2xpIHZhamEgb3NhZCBtdWRlbGkgcGFyYW1lZXRyaWQgZmlrc2VlcmlkYSBuaWktw7ZlbGRhIHN1dmFsaXN0ZWxlIHbDpMOkcnR1c3RlbGUuIAogICAgICBTZWVnYSBLb3Blcm5pa3UgbXVkZWwgdMO2w7Z0YXMgbmlpLCBuYWd1IHNlZSBvbGksIHNhbWFzIGt1aSBQdG9sZW1haW9zZSBtdWRlbCB2YWphcyBhZCBob2MgdHV1bmltaW1zdC4gIAoKS3VpIHZhYWRhdGEgS29wZXJuaWt1IHByb2R1a3RpIHRlb29yaWFuYSwgbWl0dGUgbXVkZWxpbmEsIHNpaXMgb2xpIHNlbCBzZWxnZWlkIGVlbGlzZWlkIEFyaXN0b3RlbGVzZSBlZXMuIEp1YmEgYW1tdSBvbGkgbsOkaHR1ZCBrb21lZXRlIMO8bGUgdGFldmF2w7VsdmkgbGVuZGFtYXMgKG1pcyBBcmlzdG90ZWxlc2UgasOkcmdpIGFzdXNpZCBraW5uaXN0w6RodGVkZSBtdXV0dW1hdHVzIHNmw6TDpHJpcykgamEgc3VwZXJub292YSB0ZWtraW1pc3QgamEga2FkdSwgbmluZyBlbmFtIGVpIG9sbnVkIGthdWdlbCBrYSBhZWcgbWlsIEdhbGlsZW8gam9vbmlzdGFzIG9tYSB0ZWxlc2tvb2Jpc3Qga3JhYXRyZWlkIGt1dSBwaW5uYWwsIG7DpGlkYXRlcywgZXQga3V1IGVpIHNhYW51ZCBrb29zbmVkYSB0w6RpdXNsaWt1c3QgdmlpZW5kYXN0IGVsZW1lbmRpc3QgamEgZXQgc2VsbGVsIHRvaW11c2lkIGlsbXNlbHQgc2FybmFzZWQgZsO8w7xzaWthbGlzZWQgcHJvdHNlc3NpZCBrdWkgbWFhbC4gT24gdXN1dGF2LCBldCBrdWkgS29wZXJuaWt1cyBvbGVrcyBqw7V1ZG51ZCBvbWEgcmFhbWF0dWxlIGlzZSBlc3PDtW5hIGtpcmp1dGFkYSwgb2xla3MgdGVtYSB0ZW9vcmlhIHZhc3R1dsO1dHQgb2xudWQgcGFsanUga2lpcmVtIChqYSB2YWx1bGlzZW0pLiBTZWVnYSwgdGVvb3JpYSBqYSBtdWRlbGkgZXJpc3R1cyBvbiB0w6RodGlzISAKCgoKICAgICAgS29wZXJuaWt1IHRlb29yaWFzdCB0dWxlbmViIGxvb2dpbGlzZSBwYXJhdGFtYXR1c2VuYSwgZXQgdMOkaHRlZGVsIGVzaW5lYgogICAgICBtYWFsdCB2YWFkYXRlcyBwYXJhbGxha3MuIFNlZSB0w6RoZW5kYWIsIGV0IGt1aSBtYWFrZXJhIGtvb3MgYXN0cm9ub29taWdhCiAgICAgIHRlZWIgcG9vbHJpbmdpIMO8bWJlciBww6Rpa2VzZSwgc2lpcyBraW5uaXN0w6RoZSBuw6RpdiBhc3Vrb2h0IHRhZXZhdsO1bHZpbAogICAgICBtdXV0dWIsIHNlc3QgYXN0cm9ub29tIHZhYXRsZWIgdGVkYSB0ZWlzZSBudXJnYSBhbHQuIFBhbmdlIG9tYSBuaW1ldGlzc8O1cm0KICAgICAgbsOkb3N0IHUgMTAgY20ga2F1Z3VzZWxlLCBzdWxnZWdlIHBhcmVtIHNpbG0sIHNlZWrDpHJlbCBhdmFnZSBzZWUgbmluZyBzdWxnZWdlCiAgICAgIHZhc2FrIHNpbG0gamEgdGUgbsOkZXRlIG9tYSBzw7VybWUgcGFyYWxsYWtzaSBzZWxsZSBuw6RpdmEgYXN1a29oYSBtdXV0dXNlbmEuCiAgICAgIFTDpGh0ZWRlIHBhcmFsbGFrc2kgcMO8w7x0aSBtw7XDtXRhIGp1YmEgQWxla3NhbmRyaWFzID4xMDAwIGFhc3RhdCBlbm5lIEtvcGVybmlrdXQsIAogICAgICBldCBsZWlkYSBraW5uaXR1c3QgdGVvb3JpYWxlLCBtaWxsZSBrb2hhc2VsdCBtYWFrZXJhIHRpaXJsZWIgw7xtYmVyIHDDpGlrZXNlLiAKICAgICAgTcO1w7V0bWlzZWQgZWkgbsOkaWRhbnVkIGFnYSBwYXJhbGxha3NpIG9sZW1hc29sdSAoc2VzdCBtYWEgdHJhamVrdG9vcmkgZGlhbWVldGVyIAogICAgICBvbiBwYWxqdSBsw7xoZW0ga3VpIG1hYSBrYXVndXMgdMOkaHRlZGVzdCkuIFBhcmFsbGFrcyBtw7XDtWRldGkgZWR1a2FsdCBhbGxlcyAxODM4LCAKICAgICAgc2lpcyBrdWkganViYSBhbW11IGlnYSBrb29saWrDvHRzIHVza3VzLCBldCBtYWFrZXJhIHRpaXJsZWIgw7xtYmVyIHDDpGlrZXNlIQogICAgICAKICAgICAgCgojIyAyLjMuIE1pbGxlc3Qga29vc25lYiBtdWRlbD8KCj4gTXVkZWwgb24gbWF0ZW1hYXRpbGlzZSBmb3JtYWxpc20sIG1pcyBww7zDvGFiIGtpcmplbGRhZGEgZsO8w7xzaWthbGlzdCBwcm90c2Vzc2kuCm11ZGVsaSBzdHJ1a3R1dXJpcyBvbiBrb21wb25lbnQsIG1pcyBraXJqZWxkYWIgaWRlYWFsc2VpZCBlbm51c3R1c2kgamEgZXJhbGRpIHZlYWtvbXBvbmVudCwgbWlzIGtpcmplbGRhYiBrdWlkYXMgYW5kbWVwdW5rdGlkIHZhcmllZXJ1dmFkIHNlbGxlIGlkZWFhbHNlIGVubnVzdHVzZSDDvG1iZXIuIE11ZGVsaSBrb29zdGlzb3NhZCBvbiAoaSkgbXV1dHVqYSwgbWlsbGUgdsOkw6RydHVzaSBlbm51c3RhdGtzZSAoZGVwZW5kZW50IHZhcmlhYmxlKSwgKGlpKSwgbXV1dHVqYShkKSwgbWlsbGUgdsOkw6RydHVzdGUgcMO1aGphbCBlbm51c3RhdGFrc2UgKGluZGVwZW5kZW50IHZhcmlhYmxlcyksIChpaWkpIHBhcmFtZWV0cmlkLCBtaWxsZSB2w6TDpHJ0dXNlZCBmaXRpdGFrc2UgaWkgcMO1aGphbCBqYSAoaXYpIGtvbnN0YW5kaWQuICAKICAKT2xldGFtZSwgZXQgbWUgbcO1w7V0c2ltZSBOIGluaW1lc2UgcGlra3VzZSBjbS1zIGphIGthYWx1IGtnLXMgbmluZyBtZWlkIGh1dml0YWIsIGt1aWRhcyBpbmltZXN0ZSBwaWtrdXMgc8O1bHR1YiBuZW5kZSBrYWFsdXN0LiBMaWh0c2FpbSBtdWRlbCBwaWtrdXNlIHPDtWx0dXZ1c2VzdCBrYWFsdXN0IG9uIHBpa2t1cyA9IGthYWwgKGZvcm1hbGlzZWVyaXR1bHQ6IHkgPSB4KSBqYSBzZWUgbXVkZWwgZW5udXN0YWIsIGV0IGt1aSBKb2huaSBrYWFsID0gODAga2csIHNpaXMgSm9obiBvbiA4MCBjbSBwaWtrdW5lLiBzaWluIG9uIHBpa2t1cyAqKGkpKiBtdXV0dWphLCBtaWxsZSB2w6TDpHJ0dXN0IGVubnVzdGF0YWtzZSBqYSBrYWFsICooaWkpKiBtdXV0dWphLCBtaWxsZSB2w6TDpHJ0dXN0ZSBww7VoamFsIGVubnVzdGF0YWtzZS4gTXVkZWxpIGtvbXBvbmVuZGlkICooaWlpKSogamEgKihpdikqIHB1dWR1dmFkLiBTZWxsZSBtdWRlbGkgc2FhbWUgZ3JhYWZpbGlzZWx0IGt1anV0YWRhIG5paToKIApgYGB7cn0KeCA8LSA1MDoyMDAgI3kgPSBrYWFsCnkgPC0geCAjIHggPSBwaWtrdXMgCnBsb3QoeX54LCB0eXBlPSJsIiwgeGxhYj0id2VpZ2h0IGluIGtnIiwgeWxhYj0iaGVpZ3RoIGluIGNtIiwgbWFpbj0iZml4ZWQgbGluZWFyIG1vZGVsIikKYGBgCgpOw7zDvGQgcGFpbnV0YW1lIHNlZGEgc2lyZ2V0LiBTZWUgam9vbiBvbiBpa2thIHZlZWwgdMOkaWVsaWt1bHQgZmlrc2Vlcml0dWQsIGFnYSB0YSBwb2xlIGVuYW0gc2lyZ2UgKGVoa2tpIHRlaG5pbGlzZWx0IG9uIG1laWwgaWtrYSBsaW5lYWFybmUgc2VvcyB4IGphIHkgdmFoZWwpLgoKCmBgYHtyfQp4IDwtIDUwOjIwMAp5IDwtIHggKyB4KioyCnBsb3QoeX54LCB0eXBlPSJsIikKYGBgCgpNdWRlbGkga2VlbGVzIHTDpGhpc3RhbWUgbWUgc2VkYSwgbWlkYSBtZSBlbm51c3RhbWUgKGFudHVkIGp1aHVsIHBpa2t1cykgWS1nYSBqYSBzZWRhLCBtaWxsZSB2w6TDpHJ0dXNlIHDDtWhqYWwgbWUgZW5udXN0YW1lIChhbnR1ZCBqdWh1bCBrYWFsKSBYLWdhLiBTZWVnYSBzaXJnZSBtdWRlbGkgbWF0ZW1hYXRpbGluZSBmb3JtYWxpc20gb24gWSA9IFguIFNlZSBvbiDDpMOkcm1pc2VsdCBqw6RpayBtdWRlbDogdGEgb24gc2lyZ2Uga3VqdWxpbmUgamEgc2VsbGUgc2lyZ2UgYXN1a29odCBvbiByYW5nZWx0IGZpa3NlZXJpdHVkLiBTaXJnZSBsw7Vpa2FiIHkgdGVsZ2UgYWxhdGkgMC1zIChtdWRlbGkga2VlbGVzOiBzaXJnZSBpbnRlcmNlcHQgZWhrIGzDtWlrZXB1bmt0IFkgdGVsamVsID0gMCkgamEgdGVtYSB0w7V1c3VudXJrIHNhYWIgb2xsYSBhaW51bHQgNDUga3JhYWRpIChtdWRlbGkga2VlbGVzOiBtdWRlbGkgc2xvcGUgZWhrIHTDtXVzID0gMSkuIFNlbGxlIG11ZGVsaSBqw6Rpa3VzIHR1bGVuZWIgc2VsbGVzdCwgZXQgdGVtYXMgZWkgb2xlIHBhcmFtZWV0cmVpZCwgbWlsbGUgdsOkw6RydHVzaSBtZSBzYWFrc2ltZSBtdXV0YSBlaGsgdHV1bmlkYS4gIAoKS3VpZGFzIGFnYSBraXJqZWxkYWRhIHNpcmdldCwgbWlzIHbDtWliIHBhaWtuZWRhIDItbcO1w7V0bWVsaXNlcyBydXVtaXMgw7xrc2vDtWlrIG1pbGxpc2VzIGFzZW5kaXM/IFNlbGxla3MgbGlzYW1lIG11ZGVsaXNzZSBrYWtzIHBhcmFtZWV0cml0LCBpbnRlcmNlcHQgKGEpIGphIHTDtXVzIChiKS4gS3VpIGEgPSAwIGphIGIgPSAxLCBzYWFtZSBtZSBlZWxwb29sIGtpcmplbGRhdHVkIG11ZGVsaSB5ID0geC4gS3VpIGEgPSAxMDIsIHNpaXMgc2lyZ2UgbMO1aWthYiB5IHRlbGdlIHbDpMOkcnR1c2VsIDEwMi4gS3VpIGIgPSAwLjgsIHNpaXMgeC1pIHTDtXVzdGVzIDEgw7xoaWt1IHbDtXJyYSB0w7V1c2ViIHktaSB2w6TDpHJ0dXMgMC44IMO8aGlrdSB2w7VycmEuIEt1aSBhID0gMTAwIGphIGIgPSAwLCBzaWlzIHNhYW1lIHNpcmdlLCBtaXMgb24gcGFyYWxlZWxuZSB4LXRlbGplZ2EgamEgbMO1aWthYiB5IHRlbGdlIHbDpMOkcnR1c2VsIDEwMC4gU2VlZ2EsIFRlYWRlcyBhIGphIGIgdsOkw6RydHVzaSBuaW5nIG9taXN0YWRlcyB4LWxlIHN1dmFsaXNlIG1laWQgaHV2aXRhdmEgdsOkw6RydHVzZSwgc2FhYiBlbm51c3RhZGEgeS1pIGtlc2ttaXN0IHbDpMOkcnR1c3QuIE7DpGl0ZWtzLCBvbGd1IGFuZG1ldGUgdmFzdHUgZml0aXR1ZCBtdWRlbDogCgpwaWtrdXMoY20pID0gMTAyICsgMC44ICoga2FhbChrZykgZWhrIAoKeSA9IDEwMiArIDAuOHguIAoKT21pc3RhZGVzIG7DvMO8ZCBrYWFsdWxlIHbDpMOkcnR1c2UgODAga2csIHR1bGViIG11ZGVsaSBwb29sdCBlbm51c3RhdHVkIGtlc2ttaW5lIHBpa2t1cyAxMDIgKyAwLjggKiA4MCA9IDE2NiBjbS4gSWdhIGtnIGxpc2FrYWFsdSBlbm51c3RhYiBtdWRlbGkga29oYXNlbHQgMC44IGNtIHbDtXJyYSBzdXVyZW1hdCBwaWtrdXN0LgoKCmBgYHtyfQphIDwtIDEwMgpiIDwtIDAuOAp4IDwtICAwOjEwMCAKeSA8LSAgYSArIGIgKiB4CnBsb3QoeX54LCB0eXBlPSJsIiwgeGxhYj0id2VpZ2h0IGluIGtnIiwgeWxhYj0iaGVpZ3RoIGluIGNtIiwgbWFpbj0iYSBtb3JlIGZsZXhpYmxlIGxpbmVhciBtb2RlbCIsIHlsaW09Yyg1MCwgMjAwKSkKYGBgCgpTZWUgbXVkZWwgZW5udXN0YWIsIGV0IDAga2FhbHUganV1cmVzIG9uIHBpa2t1IDEwMiBjbSwgbWlzIG9uIHJ1bWFsLCBhZ2EgbXVkZWxpdGUgcHVodWwgdGF2YWxpbmUsIG9sdWtvcmQuIE1lIHR1dW5pbWUgbXVkZWxpdCBhbmRtZXRlIHBlYWwsIG1pcyBlaSBzaXNhbGRhIDAta2FhbHUuIE1laWUgdmFsaW1pYW5kbWVkIGVpIHBlZWdlbGRhIHTDpHBzZWx0IGluaW1wb3B1bGF0c2lvb25pLiBTaXJnZSBtdWRlbCBlaSBwZWVnZWxkYSB0w6Rwc2VsdCBwaWtrdXNlLWthYWx1IHN1aHRlaWQgdmFoZW1pa3VzLCBrdXMgbWVpbCBvbiByZWFhbHNlaWQga2FhbHVhbmRtZWlkOyBqYSB0YSB0ZWViIHNlZGEgdmVlbGdpIHbDpGhlbSBzZWFsLCBrdXMgbWVpbCBtw7XDtWRldHVkIGthYWx1c2lkIGVpIG9sZS4gU2VlZ2EgcG9sZSBtw7V0ZXQgaW1lc3RhZGEsIG1pa3MgbXVkZWxpIGludGVyY2VwdCBtZWllIMO8bGUgaXJ2aXRhYi4gIAoKCiMjIyBOZWxpIG3DtWlzdGV0IAoKWCBqYSBZIG9uIG11dXR1amFkLCBhIGphIGIgb24gcGFyYW1lZXRyaWQuIE11dXR1amF0ZSB2w6TDpHJ0dXNlZCBmaWtzZWVyaXRha3NlIGFuZG1ldGUgcG9vbHQsIHBhcmFtZWV0cmlkIGZpdGl0YWtzZSBhbmRtZXRlIHDDtWhqYWwuIEZpdGl0dWQgbXVkZWwgZW5udXN0YWIgaWdhbGUgWC1pIHbDpMOkcnR1c2VsZSB2YXN0YXZhIGvDtWlnZSB0w7VlbsOkb2xpc2VtYSBZIHbDpMOkcnR1c2UgKFkga2Vza3bDpMOkcnR1c2Ugc2VsbGVsIFgtaSB2w6TDpHJ0dXNlbCkuCiAKID4gWSAtIG1pZGEgbWUgZW5udXN0YW1lIChkZXBlbmRlbnQgdmFyaWFibGUsIHByZWRpY3RlZCB2YXJhYmxlKQogCiA+IFggLSBtaWxsZSBww7VoamFsIG1lIGVubnVzdGFtZSAoaW5kZXBlbmRlbnQgdmFyaWFibGUsIHByZWRpY3RvcikKIAogPiBtdXV0dWphICh2YXJpYWJsZSkgLSBpZ2EgYXNpLCBtaWRhIG1lIHZhbGltaXMgbcO1w7VkYW1lIChYIGphIFkgb24ga2FrcyBtdXV0dWphdCkuIE11dXR1amEgdsOkw6RydHVzZWQgb24gZmlrc2Vlcml0dWQgYW5kbWV0ZSBwb29sdC4gTXV1dHVqYWwgb24gc2FtYSBwYWxqdSBmaWtzZWVyaXR1ZCB2w6TDpHJ0dXNpIGt1aSBtZWlsIG9uIHNlbGxlIG11dXR1amEga29odGEgbcO1w7V0bWlzYW5kbWVpZC4KIAogPiBwYXJhbWVldGVyIChwYXJhbWV0ZXIpIC0gbXVkZWxpIGtvZWZpdHNpZW50LCBtaWxsZWxlIHbDtWliIG9taXN0YWRhIHN1dmFsaXNpIHbDpMOkcnR1c2kuIFBhcmFtZWV0cmVpZCB0dXVuaWRlcyBmaXRpbWUgbXVkZWxpIHbDtWltYWxpa3VsdCBow6RzdGkgc29iaXR1bWEgYW5kbWV0ZWdhLgogCiAKCiMjIyAyLjQuIE11ZGVsaSBmaXR0aW1pbmUKCk11ZGVsaWQgc2lzYWxkYXZhZCAoMSkgbWF0ZW1hYXRpbGlzaSBzdHJ1a3R1dXJlLCBtaXMgbcOkw6RyYXZhZCBtdWRlbGkgdMO8w7xiaSBuaW5nICgyKSBwYXJhbWVldHJlaWQsIG1pZGEgc2FhYiBhbmRtZXRlIHDDtWhqYWwgdHV1bmlkYSwgbmlpdmlpc2kgdMOkcHN1c3RhZGVzIG11ZGVsaSBrdWp1LiAKClNlZGEgdHV1bmltaXN0IG5pbWV0YXRha3NlIG11ZGVsaSBmaXR0aW1pc2Vrcy4gTXVkZWxpdCBmaXR0aWRlcyBvbiBlZXNtw6RyayBzYWF2dXRhZGEgYW50dWQgdMO8w7xwaSBtdWRlbGkgbWFrc2ltYWFsbmUgc29iaXZ1cyBhbmRtZXRlZ2EuIE7DpGl0ZWtzIHbDtXJyYW5kIHkgPSBhICsgYnggbcOkw6RyYWIgbXVkZWxpLCBrdXMgeSA9IHggb24gb24gc2VlIHN0cnVrdHV1ciwgbWlzIHRhZ2FiLCBldCBtdWRlbGkgdMO8w7xwIG9uIHNpcmdlLCBuaW5nIGEgamEgYiBvbiBwYXJhbWVldHJpZCwgbWlzIG3DpMOkcmF2YWQgc2lyZ2UgYXNlbmRpLiBTZWV2YXN0dSBzdHJ1a3R1dXIgeSA9IHggKyB4XjIgdGFnYWIsIGV0IG11ZGVsaSB5ID0gYSArIGIxeCArIGIyeF4yICB0w7zDvHAgb24gcGFyYWJvb2wsIG5pbmcgcGFyYW1lZXRyaXRlIGEsIGIxIGphIGIyIHbDpMOkcnR1c2VkIG3DpMOkcmF2YWQgc2VsbGUgcGFyYWJvb2xpIHTDpHBzZSBrdWp1LiBKYSBuaWkgZWRhc2kuIAoKICAgIGxpbmVyYWFyc2UgbXVkZWxpIG1ha3NpbWFhbHNlIHNvYml2dXNlIGFuZG1ldGVnYSBzYWFiIHRhZ2FkYSBrYWhlbCBlcmluZXZhbCB2aWlzaWw6IAogICAgKGkpIHbDpGhpbXJ1dXR1ZGUgbWVldG9kIGFydnV0YWIgaWdhIGFuZG1lcHVua3RpIGthdWd1c2UgbXVkZWxpIGVubnVzdHVzZXN0IHbDtXRhYiAKICAgIHNlbGxlIGthdWd1c2UgcnV1dHUsIHN1bW1lZXJpYiB0dWxlbXVzZWQgamEgbGVpYWIgc2lyZ2UgYXNlbmRpLCBrdXMgc2VlIHN1bW1hIAogICAgb24gbWluaW1hYWxuZTsgCiAgICAoaWkpIEJheWVzaSB0ZW9yZWVtIGFubmFiIHbDpGhlaW5mb3JtYXRpaXZzZSBwcmlvcmkga29ycmFsIHByYWt0aWxpc2VsdCBzYW1hIGZpdGkuIAogIAogSGVhIG11ZGVsIG9uIAogCiAoMSkgdsO1aW1hbGlrdWx0IGxpaHRzYSBzdHJ1a3R1dXJpZ2EsIG1pbGxlIHDDtWhqYWwgb24gdmVlbCB2w7VpbWFsaWsgdGVoYSBqw6RyZWxkdXNpIHByb3RzZXNzaSBrb2h0YSwgbWlzIGdlbmVyZWVyaXMgbXVkZWxpIGZpdHRpbWlzZWtzIGthc3V0YXR1ZCBhbmRtZWlkOyAKIAogKDIpIHNvYml0dWIgcGlpc2F2YWx0IGjDpHN0aSBhbmRtZXRlZ2EgKGVyaXRpIHV1dGUgYW5kbWV0ZWdhLCBtaWRhIGVpIGthc3V0YXR1ZCBzZWxsZSBtdWRlbGkgZml0dGltaXNla3MpLCBldCBvbGxhIHJlbGV2YW50bmUgYW5kbWVpZCBnZW5lcmVlcml2YSBwcm90c2Vzc2kga2lyamVsZHVzOyAKIAogKDMpIGdlbmVyZWVyaWIgdXN1dGF2YWlkIHNpbXVsZWVyaXR1ZCBhbmRtZWlkIChzZWUgbsOkaXRhYiBtdWRlbGkga3ZhbGl0ZWV0aSkuCiAKIFNhZ2VsaSBmaXRpdGtzZSBzYW1hZGUgYW5kbWV0ZWdhIG1pdHUgZXJpbmV2YXQgdMO8w7xwaSBtdWRlbGl0IGphIHDDvMO8dGFrc2Ugb3RzdXN0YWRhLCBtaWxsaW5lIG5laXN0IHZhc3RhYiBrw7VpZ2UgcGFyZW1pbmkgZWVsdG9vZHVkIHRpbmdpbXVzdGVsZS4gTsOkaXRla3MsIGt1aSBzaXJnZSBzdXVkYWIga2FhbHUgasOkcmdpIHBpa2t1c3QgZW5udXN0YWRhIHBhcmVtaW5pIGt1aSBwYXJhYm9vbCwgc2lpcyBvbiBzaXJnZSBtdWRlbCBwYXJlbWFzIGtvb3Nrw7VsYXMgdGVhZHVzbGlrdSBow7xwb3RlZXNpZ2EsIG1pcyBhbm5ha3MgbWVoaGFuaXNtaSBwcm90c2Vzc2lsZSwgbWlsbGUga8OkaWd1cyBraWxvZGUgbGlzYW5kdW1pbmUgdmlpa3MgbGFpYXMga2FhbHV2YWhlbWlrdXMgaW5pbWVzdGUgcGlra3VzZSBrYXN2dWxlIGlsbWEsIGV0IHBpa2t1c2Uga2FzdnUgdGVtcG8ga2FhbHUgdMO1dXN0ZXMgbGFuZ2Vrcy4gCiAKIFNlZSwgZXQgdGVpZSBhbmRtZWQgc29iaXZhZCBow6RzdGkgbWluZ2kgbXVkZWxpZ2EsIGVpIHTDpGhlbmRhIGF1dG9tYWF0c2VsdCwgZXQgc2VlIGZha3Qgb2xla3MgdGVhZHVzbGlrdWx0IGh1dml0YXYuIE11ZGVsaSBwYXJhbWVldHJpZCBvbiBtw7V0ZWthZCBtdWRlbGkgbWF0ZW1hYXRpbGlzZSBraXJqZWxkdXNlIGtvbnRla3N0aXMsIGFnYSBtaXR0ZSB0aW5naW1hdGEgc3V1cmUgbWFhaWxtYSBww7VoanVzbGlrdSBzZWxldGFtaXNlIGtvbnRla3N0aXMuIFNpaXNraSwga3VpIG11ZGVsaSBtYXRlbWFhdGlsaW5lIHN0cnVrdHV1ciBsb29kaSBhbmRtZWlkIGdlbnJlZWVyaXZhIGxvb2R1c2xpa3UgcHJvdHNlc3NpIG9sZW11c3Qgc2lsbWFzIHBpZGFkZXMsIHbDtWliIG11ZGVsaSBrb2VmaXRzaWVudGlkZSB1dXJpbWlzZXN0IHNlbGd1ZGEgb2x1bGlzaSB0w7VzaWFzanUgc3V1cmUgbWFhaWxtYSBrb2h0YS4gCiAgCiMjIyPDnGxlLSBqYSBhbGFmaXR0aW1pbmUKICAKICBPc2FkIG11ZGVsaXRlIHTDvMO8YmlkIG9uIHbDpGhlbSBwYWluZGxpa3VkIGt1aSB0ZWlzZWQgKHBhcmFtZWV0cmVpZCB0dXVuaWRlcyBvbiBuZWlsIHbDpGhlbSBsaWlrdW1pc3J1dW1pKS4gS3VpZ2kgc2VsbGlzZWQgbXVkZWxpZCBzb2JpdHV2YWQgaGFsdmVtaW5pIGFuZG1ldGVnYSwgdsO1aXZhZCBuZWVkICBpa2thZ2kgcGFyZW1pbmkga3VpIG3DtW5pIHBhaW5kbGlrdW0gbXVkZWwgdsOkbGphIHR1dWEgYW5kbWV0ZSBwZWlkZXR1ZCBvbGVtdXNlLiBNdWRlbGRhbWluZSBlZWxkYWIsIGV0IG1lIHVzdW1lLCBldCBtZWllIGFuZG1ldGVzIGxlaWR1YiBuaWkgbcO8cmEgKG1pZGEgbXVkZWwgdsO1aWtzIGlnbm9yZWVyaWRhKSwga3VpIHNpZ25hYWwgKG1pZGEgbXVkZWwgcMO8w7xhYiB0YWJhZGEpLiBLdW5hIG11ZGVsaSBqYW9rcyBuw6RlYiBtw7xyYSBzYW1hbW9vZGkgdsOkbGphLCBrdWkgc2lnbmFhbCwgb24gaWdhIG11ZGVsIGtvbXByb21pc3Mgw7xsZS0gamEgYWxhZml0dGltaXNlIHZhaGVsLiBNZSBsaWh0c2FsdCBsb29kYW1lLCBldCBtZWllIG11ZGVsIG9uIHBpaXNhdmFsdCBqw6RpaywgZXQgbWl0dGUgbGlpZ2EgcGFsanUgbcO8cmEgbW9kZWxsZWVyaWRhIGphIHNhbWFzIHBpaXNhdmFsdCBwYWluZGxpaywgZXQgcGlpc2F2YWwgbcOkw6RyYWwgc2lnbmFhbGkgdGFiYWRhLgogIAogIMOca3Mga8O1aWdlIGrDpGlnZW1haWQgbXVkZWxlaWQgb24gc2lyZ2UsIG1pcyB0w6RoZW5kYWIsIGV0IHNpcmdlIG11ZGVsIG9uIHN1dXJlIHTDtWVuw6Rvc3VzZWdhIGFsYWZpdHRpdHVkLiBLZWVyYSBzaXJnZXQga3VpcGFsanUgdGFoYWQsIGlra2EgZWkgc29iaXR1IHRhIGVuYW1pa3UgYW5kbWVrb2d1ZGVnYS4gSmEgbmVlZCB2w6RoZXNlZCBhbmRtZWtvZ3VkLCBtaXMgc2lyZ2UgbXVkZWxpZ2Egc29iaXZhZCwgb24gZ2VuZXJlZXJpdHVkIHRlYXR1ZCB0w7zDvHBpIGxpbmVhYXJzZXRlIHByb3RzZXNzaWRlIHBvb2x0LiBTaXJnZSBvbiBzZWVnYSDDvGtzIGvDtWlnZSBwYXJlbWluaSB0w7VsZ2VuZGF0YXZhaWQgbXVkZWxlaWQuIFRlaXNlcyDDpMOkcm11c2VzIG9uIHBvbMO8bm9vbXNlZCBtdWRlbGlkLCBtaXMgb24gdsOkZ2EgcGFpbmRsaWt1ZCwgbWlkYSBvbiB2w6RnYSByYXNrZSB0w7VsZ2VuZGFkYSBqYSBtaWxsZSBwdWh1bCBlc2luZWIgc3V1ciBtdWRlbGkgw7xsZWZpdHRpbWlzZSBvaHQuIMOcbGVmaXRpdHVkIG11ZGVsIGrDpHJnaWIgbmlpIHTDpHBzZWx0IHZhbGltaWFuZG1laWQsIGV0IHNvYml0dWIgaMOkc3RpIHZhbGltaXMgbGVpZHV2YSBqdWh1c2xpa3UgbcO8cmFnYSBuaW5nIHNlZXTDtXR0dSBzb2JpdHViIGhhbHZhc3RpIGrDpHJnbWlzZSB2YWxpbWlnYSBzYW1hc3QgcG9wdWxhdHNpb29uaXN0IChpZ2FsIHZhbGltaWwgb24gb21hIGp1aHVzbGlrIG3DvHJhKS4gw5xsZGlzZWx0LCBtaWRhIHJvaGtlbSBvbiBtdWRlbGlzIHR1dW5pdGF2YWlkIHBhcmFtZWV0cmVpZCwgc2VkYSBwYWluZGxpa3VtIG9uIG11ZGVsLCBzZWRhIGtlcmdlbSBvbiBzZWRhIHZhbGltaWFuZG1ldGVnYSBzb2JpdGFkYSBqYSBzZWRhIHJhc2tlbSBvbiBzZWRhIHTDtWxnZW5kYWRhLiBWZWVsZ2kgZW5hbSwgYWxhdGkgb24gdsO1aW1hbGlrIGtvbnN0cnVlZXJpZGEgbXVkZWwsIG1pcyBzb2JpdHViIHTDpGl1c2xpa3VsdCBrw7Vpa2lkZSBhbmRtZXB1bmt0aWRlZ2EgKHNlbGxlIG11ZGVsaSBwYXJhbWVldHJpdGUgYXJ2ID0gTikuIFNlbGxpbmUgbXVkZWwgb24gdMOkcHNlbHQgc2FtYSBpbmZvcm1hdGlpdm5lIGt1aSBhbmRtZWQsIG1pbGxlIHDDtWhqYWwgc2VlIGZpdGl0aSAtLS0gamEgdMOkaWVzdGkga2FzdXR1LgogIAogIApgYGB7ciBlY2hvPUZBTFNFfQpkZiA8LSB0aWJibGUoeD1jKDIsIDMsIDIuMiwgNSwgNywgOCksIHk9Yyg4LCA1LCA5LCAxMCwgMTEsIDEwLjEpKQptb2RfZTEgPC0gbG0oeSB+IHgsIGRhdGEgPSBkZikKbW9kX2UyIDwtIGxtKHkgfiBwb2x5KHgsIDIpLCBkYXRhID0gZGYpCm1vZF9lMyA8LSBsbSh5IH4gcG9seSh4LCAzKSwgZGF0YSA9IGRmKQptb2RfZTQgPC0gbG0oeSB+IHBvbHkoeCwgNCksIGRhdGEgPSBkZikKbW9kX2U1IDwtIGxtKHkgfiBwb2x5KHgsIDUpLCBkYXRhID0gZGYpCgpkZiAlPiUgCiAgdGlkeXI6OmV4cGFuZChkZikgJT4lIAogIGdhdGhlcl9wcmVkaWN0aW9ucyhtb2RfZTEsIG1vZF9lMiwgbW9kX2UzLCBtb2RfZTQsIG1vZF9lNSkgJT4lIAogIGdncGxvdChhZXMoeCwgcHJlZCwgY29sb3VyID0gbW9kZWwpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoYWVzKHgsIHkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTIpIAoKYGBgCipKb29uaXM6IEthc3ZhdmEgcGFpbmRsaWt1c2VnYSBwb2zDvG5vb21zZWQgbXVkZWxpZC4gbW9kX2UxIG9uIHNpcmdlIHbDtXJyYW5kIHkgPSBhICsgYjF4ICgyIHBhcmFtZWV0cml0OiBhIGphIGIxKSwgbW9kX2UyIG9uIGxpaHRzYWltIHbDtWltYWxpayBwb2zDvG5vb206IHk9IGEgKyBiMXggKyBiMnheMiAoMyBwYXJhbWVldHJpdCksIC4uLiwgbW9kX2U1OiB5PSBhICsgYjF4ICsgYjJ4XjIgKyBiM3heMyArIGI0eF40ICsgYjV4XjUgKDYgcGFyYW1lZXRyaXQpLiBtb2RfZTUgdmFzdGFiIHTDpHBzZWx0IGFuZG1lcHVua3RpZGVsZSAoTiA9IDYpLioKClbDpGhlbXJ1dXR1ZGUgbWVldG9kaWwgZml0aXR1ZCBtdWRlbGVpZCBzYWFtZSB2w7VycmVsZGEgQUlDLWkgbsOkaXRhamEgasOkcmdpLiBBSUMgIC0gQWthaWtlIEluZm9ybWF0c2lvb25pIEtyaXRlZXJpdW0gLSB2YWF0YWIgbXVkZWxpIHNvYml2dXN0IGFuZG1ldGVnYSBqYSBtdWRlbGkgcGFyYW1lZXRyaXRlIGFydnUuIApWw6Rpa3NlaW0gQUlDIHTDpGhpdGFiIHBhcmltYXQgZml0dGkgdsOkaWtzZWltYSBwYXJhbWVldHJpdGUgYXJ2dSBqdXVyZXMgKGtvbXByb21pc3NpKSBqYSB2w6Rpa3NlaW1hIEFJQy1nYSBtdWRlbCBvbiBlZWxpc3RhdHVpbSBtdWRlbC4gQWdhIHNlZGEgYWludWx0IHbDtXJyZWxkdWQgbXVkZWxpdGUgaHVsZ2FzLiBBSUMtaSBhYnNvbHV1dHbDpMOkcnR1cyBlaSBsb2UgLSBzZWUgb24gc3VodGVsaW5lIG7DpGl0YWphLgpgYGB7cn0KQUlDKG1vZF9lMSwgbW9kX2UyLCBtb2RfZTMsIG1vZF9lNCwgbW9kX2U1KQpgYGAKCkFJQyBuw6RpdGFiLCBldCBwYXJpbSBtdWRlbCBvbiBtb2RfZTQuIEFnYSBrYXMgc2VlIG9uIGthIGvDtWlnZSBrYXN1bGlrdW0gbXVkZWw/IE1pcyBzaWlzLCBrdWkgMy1zIGFuZG1lcHVua3Qgb24gYW5kbWVzaXNlc3RhamEgbsOkcHV2aWdhPwoKYGBge3IsIGVjaG89RkFMU0V9CmExIDwtIGdsYW5jZShtb2RfZTEpCmEyIDwtIGdsYW5jZShtb2RfZTIpCmEzPC0gZ2xhbmNlKG1vZF9lMykKYTQ8LSBnbGFuY2UobW9kX2U0KQphIDwtIGJpbmRfcm93cyhhMSxhMixhMyxhNCkKcGxvdCgyOjUsIGEkci5zcXVhcmVkLCB0eXBlPSJsIiwgeGxhYj0ibnIgb2YgcGFyYW1ldGVycyIsIHlsYWI9IlIgc3F1YXJlZCIpCmBgYAoqSm9vbmlzOiBzZWRhbcO2w7ZkYSBrdWlkYXMgcGFyYW1lZXRyaXRlIGFydiBtdWRlbGlzIGthc3ZhYiwga2FzdmFiIGthIFIgcnV1dC4gUiBydXV0IDAuOCB0w6RoZW5kYWIsIGV0IHgtaSB2YXJpZWVydXZ1cyBzdXVkYWIgc2VsZXRhZGEga3VuaSA4MCUgeS1pIHZhcmllZXJ1dnVzZXN0LiBMaXNhcGFyYW1lZXRyaSBsaXNhbWluZSBlaSBzYWEgcMO1aGltw7V0dGVsaXNlbHQgUiBydXV0dSB2w6RoZW5kYWRhLiBBZ2Egc2VsbGUga2FzdnUga2lpcnVzIG9uIGFlZ2x1c3R1di4gw5xoZWwgaGV0a2VsIGVpIMO1aWd1c3RhIG11ZGVsaSBmaXRpIHBhcmFuZW1pbmUgZW5hbSBtdWRlbGkgcGFpbmRsaWt1c2Uga2FzdnUgKG1pcyBtw7VsZW1hZCBzYWF2dXRhdGFrc2UgcGFyYW1lZXRyZWlkIGxpc2FkZXMpLioKCiAgICDDnGxlZml0dGltaXNlIHbDpGx0aW1pc2VrcyBrYXN1dGF2YWQgQmF5ZXNpIG11ZGVsaWQgaW5mb3JtYXRpaXZzZWlkIHByaW9yZWlkLCAKICAgIG1pcyB2w6RsaXN0YXZhZCBla3N0cmVlbXNlZCBwYXJhbWVldHJpdsOkw6RydHVzZWQuIAogICAgVnQgaHR0cDovL2VsZXZhbnRoLm9yZy9ibG9nLzIwMTcvMDgvMjIvdGhlcmUtaXMtYWx3YXlzLXByaW9yLWluZm9ybWF0aW9uLyAKCgoKIyMgMi41LiBWZWFtdWRlbAogIApFZWxwb29sIGtpcmplbGRhdHVkIG11ZGVsaWQgb24gZGV0ZXJtaW5pc3RsaWt1ZCAtLS0gbmFkIGVpIHNpc2FsZGEgaGlubmFuZ3V0IGFuZG1ldGUgdmFyaWVlcnV2dXNlbGUgZW5udXN0dXNlIMO8bWJlci4gTmVpZCBrdXRzdXRha3NlIGthICoqcHJvdHNlc3NpIG11ZGVsaXRla3MqKiBzZXN0IG5hZCBtb2RlbGxlZXJpdmFkIHByb3RzZXNzaSB0w6Rwc2VsdC4gRWhrIGt1aSBtdWRlbCBlbm51c3RhYiwgZXQgODAga2cgaW5pbWVuZSBvbiAxNjYgY20gcGlra3VuZSwgc2lpcyBwcm90c2Vzc2kgbXVkZWwgZWkgw7x0bGUsIGt1aSBzdXVydCBrYWFsdXN0IHPDtWx0dW1hdHV0IHBpa2t1c3RlIHZhcmllZXJ1dnVzdCB2w7VpbWUgb29kYXRhIDgwIGtnLXN0ZSBpbmltZXN0ZSBodWxnYXM/IFNlbGxlIGhpbm5hbmd1IGFuZG1pc2VrcyB0dWxlYiBtdWRlbGlsZSBsaXNhZGEgdmVlbCDDvGtzIGtvbXBvbmVudCwgKip2ZWFtdWRlbCoqIGVoayB2ZWFrb21wb25lbnQsIG1pcyBzYWdlbGkgdHV1YWtzZSBzaXNzZSBub3JtYWFsamFvdHVzZSBrdWp1bC4gVmVha29tcG9uZW50IG1vZGVsbGVlcmliIMO8a3Npa3V0ZSBpbmltZXN0ZSBwaWtrdXN0ZSB2YXJpZWVydXZ1c3QgKG1pdHRlIGtlc2ttaXNlIHBpa2t1c2UgdmFyaWVlcnV2dXN0KSBpZ2FsIG3DtWVsZGF2YWwgamEgbWl0dGVtw7VlbGRhdmFsIGthYWx1bC4gVMOkbnUgc2VsbGVsZSBlaSBvbGUgbXVkZWxpIGVubnVzdHVzZWQgZW5hbSBkZXRlcm1pbmlzdGxpa3VkLCB2YWlkIHTDtWVuw6Rvc3VzbGlrdWQuIAoKICAgIEJpb2xvb2dpZCwgZXJpbmV2YWx0IGbDvMO8c2lrdXRlc3QsIHVzdXZhZCwgZXQgdmFsaW1pc2lzZW5lIGFuZG1ldGUgdmFyaWVlcnV2dXMgb24KICAgIHBpZ2VtIHRpbmdpdHVkIGJpb2xvb2dpbGlzZXN0IHZhcmllZXJ1dnVzZXN0IGt1aSBtw7XDtXRtaXN2ZWFzdC4gQWdhIGxvb211bGlrdWx0IG9uCiAgICBzZWFsIG9sZW1hcyBrYSBtw7XDtXRtaXN2aWdhLiBMaWh0c3VzZSBqYSBhamFsb29saXNlIGrDpHJqZXBpZGV2dXNlIGh1dmlkZXMgcsOkw6RnaW1lCiAgICBqw6RyZ25ldmFsdCB2ZWFtdWRlbGlzdCwgbWl0dGUgImJpb2xvb2dpbGlzZSB2YXJpZWVydXZ1c2UgamEgdmVhbXVkZWxpc3QiLgoKS3VpZGFzIHZlYWtvbXBvbmVudCBsaW5lYWFyc2Vzc2UgbXVkZWxpc3NlIHNpc3NlIHR1dWE/CgppbG1hIHZlYWtvbXBvbmVuZGl0YSBtdWRlbDogKnkgPSBhICsgYngqCgpWZWFrb21wb25lbnQgdMOkaGVuZGFiLCBldCB5LWkgdsOkw6RydHVzIHZhcmllZXJ1YiDDvG1iZXIgbXVkZWxpIHBvb2x0IGVubnVzdGF0dWQga2Vza3bDpMOkcnR1c2UgamEgc2VkYSB2YXJpZWVydXZ1c3Qgbm9ybWFhbGphb3R1c2VnYSBtb2RlbGxlZXJpZGVzIHNhYW1lCgoqeSB+IGRub3JtKG11LCBzaWdtYSkqIAoKa3VzICptdSogb24gbXVkZWxpIHBvb2x0IGVubnVzdGF0dWQga2Vza3bDpMOkcnR1cyBqYSAqc2lnbWEqIG9uIG11ZGVsaSBwb29sdCBlbm51c3RhdHVkIHN0YW5kYXJkaMOkbHZlIGVoayB2YXJpZWVydXZ1cyBhbmRtZXB1bmt0aWRlIHRhc2VtZWwuIFRpbGRlIH4gdMOkaGlzdGFiIHNlb3NlIHTDtWVuw6Rvc3VzbGlra3VzdC4KClNpcmdlIG11ZGVsaXNzZSB2YXJpZWVydXZ1c2Ugc2lzc2UgdG9vbWlzZWtzIGRlZmluZWVyaW1lIG11IMO8bWJlciBuw7VuZGE6CgoqbXUgPSBhICsgYngqLCBtaXMgdMOkaGVuZGFiLCBldAoKKnkgfiBkbm9ybShhICsgYngsIHNpZ21hKSoKClNlZSBvbmdpIHNpcmdlIG11ZGVsIGtvb3MgdmVha29tcG9uZW5kaWdhLiBTZWVnYSBvbiBzZWxsZWwgbGluZWFhcnNlbCByZWdyZXNzaW9vbmltdWRlbGlsIGtvbG0gcGFyYW1lZXRyaXQ6IGludGVyY2VwdCAqYSosIHTDtXVzICpiKiBqYSAidmVhcGFyYW1lZXRlciIgKnNpZ21hKi4gU2VsbGlzdCBtdWRlbGl0IG9uIG3DtWlzdGxpa3VtIGZpdHRpZGEgQmF5ZXNpIHRlb3JlZW1pIGFiaWwsIGt1aSB2w6RoaW1ydXV0dWRlIG1lZXRvZGlsLiBCYXllc2kgbWVldG9kaWdhIGZpdGl0dWQgbXVkZWwsIG1pZGEga3V0c3V0YWtzZSBwb3N0ZWVyaW9yaWtzLCBuw6RpdGFiLCBtaWxsaXNlZCBrb21iaW5hdHNpb29uaWQgbmVuZGVzdCBrb2xtZXN0IHBhcmFtZWV0cmlzdCB1c3V0YXZhbHQga29vcyBlc2luZXZhZCAoamEgbWlsbGlzZWQgbWl0dGUpLiBTZWVnYSBvbiBmaXRpdHVkIDMgcGFyYW1lZXRyaWdhIGJheWVzaSBtdWRlbCAzLWRpbWVuc2lvbmFhbG5lIHTDtWVuw6Rvc3VzamFvdHVzICgzRCBwb3N0ZWVyaW9yKS4gTXVpZHVnaSBzYWFtZSBrYSDDvGtzaGFhdmFsIHbDpGxqYSBwbG90dGlkYSBrb2xtIDFEIHBvc3RlZXJpb3JpLCBtaWxsZXN0IGlnYcO8a3MgaXNlbG9vbXVzdGFiIMO8aHQgcGFyYW1lZXRyaXQgbmluZyBvbiBrb2xsYXBzZWVyaXR1ZCDDvGxlIGthaGUgw7xsZWrDpMOkbnVkIHBhcmFtZWV0cmkuIDQuIHBlYXTDvGtpcyDDtXBpbWUgc2VsbGlzdGUgbXVkZWxpdGVnYSB0w7bDtnRhbWEuIAoKCgo+IEvDtWlrIHN0YXRpc3RpbGlzZWQgbXVkZWxpZCBvbiB0w7VlbsOkb3N1c211ZGVsaWQgbmluZyBzaXNhbGRhdmFkIHZlYWtvbXBvbmVudGkuIFTDtWVuw6Rvc3VzbXVkZWwgb24gbWF0ZW1hYXRpbGluZSBmdW5rdHNpb29uLCBtaXMgIHgtdGVsamVsIGxvZWIgw7xsZXMga8O1aWsgdsO1aW1hbGlrdWQgc8O8bmRtdXN0ZXN0IGphIHktdGVsamVsIGFubmFiIG5lbmRlIGvDtWlraWRlIHRvaW11bWlzZSB0w7VlbsOkb3N1c2VkLiAgCgoKIyMjU3RhdGlzdGlsaW5lIG11ZGVsIGtvb3NuZWIgMyBrb21wb25lbmRpc3Q6IAogICAgCiAgICA+ICgxKSBtYXRlbWFhdGlsaW5lIHN0cnVrdHV1ciwgbWlzIHNpc2FsZGFiIG11dXR1amFpZCBqYSBhbm5hYiBtdWRlbGkgdMO8w7xiaSwgCiAgICAKICAgID4gKDIpIHR1dW5pdGF2YWQgcGFyYW1lZXRyaWQgamEgCiAgICAKICAgID4gKDMpIHZlYW11ZGVsLgoKTXVpZGUsIGvDtWlrIHZlYW11ZGVsaWQsIG1pbGxlZ2EgbWUgZWRhc3BpZGkgdMO2w7Z0YW1lLCBtb2RlbGxlZXJpdmFkIGlnYWxlIHgtaSB2w6TDpHJ0dXNlbGUgKGthYWx1bGUpIHNhbWEgc3V1cmUgeS1pIHN1dW5hbGlzZSB2YXJpZWVydXZ1c2UgKHBpa2t1c3RlIHNkKS4gU3V1cmVtIG9zYSBzdGF0aXN0aWthc3Qga2FzdXRhYiBlZWxkdXNpLCBtaWRhIGtlZWdpIHDDpHJpc2VsdCB0w7VlIHDDpGhlIGVpIHbDtXRhLCBhZ2EgbWlsbGVnYSBvbiBhcnZ1dHVzbGlrdXMgbcO1dHRlcyBsaWh0c2FtIGVsYWRhLgoKCiMjIyAyLjUuMS4gRW5pbWthc3V0YXR1ZCB2ZWFtdWRlbCBvbiBub3JtYWFsamFvdHVzLiAKCgpOb3JtYWFsamFvdHVzZSBtYXRlbWFhdGlsaW5lIGtpcmplbGR1cyBvbiBzdWh0ZWxpc2VsdCBrZWVydWxpbmUsIGFnYSBzZWUgb24gcHVodGFsdCB0aW5naXR1ZCB2YWphZHVzZXN0IGphb3R1c2UgYWx1c2UgcGluZGFsYSBub3JtYWxpc2VlcmltaXNlc3Qgw7xoZWxlLiBUZWdlbGlrdWx0IHbDtWltZSBkZW1vbnN0cmVlcmlkYSBub3JtYWFsamFvdHVzZSBrdWp1bGlzdCBqYW90dXN0IHbDpGdhIGxpaHRzYXRlIHZhaGVuZGl0ZWdhLiBKw6RyZ25ldiBuw6RpdGFiIGthLCBtaWxsaXNlZCBsb29kdXNsaWt1ZCBwcm90c2Vzc2lkIHbDtWlrc2lkIHRla2l0YWRhIG5vcm1hYWxzZWlkIGFuZG1lZCwgamEgbWlsbGlzZWQgbWl0dGUuIAoKbm9ybWFhbGphb3R1c2UgdsO1aWIgc2FhZGEgbGlodHNhIGxpaXRtaXNlIHRlZWwuIE9sZXRhbWUsIGV0IGJha3Rlcmkga2FzdnVraWlydXN0IG3DtWp1dGF2YWQgMTIgZ2VlbmksIG1pbGxlIG3DtWp1ZCB2w7VpdmFkIG9sbGEgdsOkZ2EgZXJpbmV2YSB0dWdldnVzZWdhLCBrdWlkIG5lbmRlIG3DtWp1ZGUgc3V1cnVzZWQgZWkgc8O1bHR1IMO8a3N0ZWlzZXN0LiBTZWVnYSBuZW5kZSAxMiBnZWVuaSBtw7VqdWQga2FzdnVraWlydXNlbGUgbGlpdHV2YWQuCkrDpHJnbmV2YXMga29vZGlzIG1lIHbDtXRhbWUgMTIganVodXZhbGltaXQgYXJ2dWRlc3QgMSBqYSAxMDAgdmFoZWwgKGthc3V0YWRlcyBydW5pZigpIGZ1bmt0c2lvb25pKS4gTmVlZCAxMiBhcnZ1IG7DpGl0YXZhZCAxMiBlcmluZXZhIGdlZW5pIGluZGl2aWR1YWFsc2V0ZSBtw7VqdWRlIHN1dXJ1c2kgYmFrdGVyaXTDvHZlIGthc3Z1a2lpcnVzZWxlLiBNZWlsIG9uIHNlZWdhIGt1bmkgMTAwLWtvcmRzZWQgZXJpbmV2dXNlZCBlcmluZXZhdGUgZ2VlbmlkZSBtw7VqdWRlIHN1dXJ1c3RlIHZhaGVsLiAKU2VlasOkcmVsIGxpaWRhbWUgbmVlZCAxMiBhcnZ1LiBOw7zDvGQgdsO1dGFtZSB1dWUgMTItc2UgdmFsaW1pIGphIGtvcmRhbWUgZWVsbmV2YXQuIApNZSB0ZWVtZSBzZWRhIDEwIDAwMCBrb3JkYSBqw6RyamVzdCBqYSBwbG90aW1lIHNhYWR1ZCAxMCAwMDAgYXJ2dSAoMTAgMDAwIGxpaXRtaXN0ZWh0ZSB0dWxlbXVzdCkgdGloZWR1c2Z1bnRrc2lvb25pbmEuIAoKYGBge3J9Cmthc3YgPC0gcmVwbGljYXRlKCAxMDAwMCAsIHN1bSggcnVuaWYoIDEyLCAxLCAxMDAgKSApICkgCmRlbnMoIGthc3YgKQpgYGAKClNlbGxlcyBuw6RpdGVzIHbDtXJkdWIgaWdhIGFuZG1lcHVua3QgMTAgMDAwc3Qgw7xoZSBiYWt0ZXJpdMO8dmUga2FzdnVraWlydXNlIG3DtcO1dG1pc2VnYSAoZWVsZGFkZXMsIGV0IG3DtcO1dG1pc3ZpZ2EgcHV1ZHViKS4gU2VlZ2EsIGFudHVkIGVlbGR1c3RlIGtvcnJhbCBvbiBiYWt0ZXJpdMO8dmVkZSBrYXN2dWtpaXJ1c2VkIG5vcm1hYWxqYW90dXNlZ2EuCgpOw7zDvGQgdmFhdGFtZSwgbWlzIGp1aHR1YiBrdWkgMTIgZ2VlbmkgbcO1anVkIGVpIG9sZSDDvGtzdGVpc2VzdCBzw7VsdHVtYXR1ZC4gS3VpIDEyIGdlZW5pIG9uIG9tYXZhaGVsIHZhc3Rhc23DtWp1ZGVzLCBzaWlzIG5lbmRlIGdlZW5pZGUgbcO1anVkIGtvcnJ1dHV2YWQsIG1pdHRlIGVpIGxpaXR1LgpLw7VpZ2VwZWFsdCB2YWF0bGVtZSBqdWh0dSwga3VzIDEyIGdlZW5pIG9uIGvDtWlrIHbDpGlrZXN0ZSBtw7VqdWRlZ2EgbmluZyBzZWVnYSBtaXR0ZSDDvGhlZ2kgZ2VlbmkgbcO1anUgZWkgZG9taW5lZXJpIHRlaXN0ZSDDvGxlLgpTZWVrb3JkIHbDtXRhbWUgb21hIDEyIGp1aHV2YWxpbWl0IGFydnVkZXN0IDEgamEgMS4xIHZhaGVsLiAxIHTDpGhlbmRhYiAwLWthc3Z1IGphIDEuMSB0w6RoZW5kYWIgMTAlIGthc3Z1LiBTZWVqw6RyZWwga29ycnV0YW1lIG5lZWQgMTIgYXJ2dSwgbWlzasOkcmVsIGtvcmRhbWUgZWVsbmV2YXQgMTAgMDAwIGtvcmRhLiAKCmBgYHtyfQprYXN2IDwtIHJlcGxpY2F0ZSggMTAwMDAgLCBwcm9kKCBydW5pZiggMTIsIDEsIDEuMSApICkgKSAKZGVucygga2FzdiApCmBgYAoKRWVsbWlzZXMgbsOkaXRlcyBvbGlkIG5lZWQgw7xrc2lrdWQgaW50ZXJha3RlZXJ1dmFkIGdlZW5pZCDDvGtzaGFhdmFsIHbDpGlrZXN0ZSBtw7VqdWRlZ2EuIE1pdHRlIMO8aGVnaSBnZWVuaSBtw7VqdSBlaSBkb21pbmVlcmkgdGVpc3RlIMO8bGUuIE1pcyBqdWh0dWIsIGt1aSBtw7VuZWwgZ2VlbmlsIG9uIGt1bmkgMiBrb3JkYSBzdXVyZW0gbcO1anUga3VpIHRlaXNlbD8KCmBgYHtyfQprYXN2IDwtIHJlcGxpY2F0ZSggMTAwMDAgLCBwcm9kKCBydW5pZigxMiwxLDIpICkgKSAKZGVucygga2FzdiApCmBgYAoKTsO8w7xkIG9uIHR1bGVtdXNla3MgbG9nLW5vcm1hYWxqYW90dXMuIE1pcyB0ZWllIGFydmF0ZSwga2FzIGJpb2xvb2dpYXMgb24gZW5hbWFzdGkgdGVndSBmYWt0b3JpdGVnYSwgbWlzIG9tYXZhaGVsIGVpIGludGVyYWt0ZWVydSB2w7VpIGt1aSBpbnRlcmFrdGVlcnV2YWQsIG9uIGvDtWlrIMO8aHRsYXNlbHQgdsOkaWtlc3RlIGVmZWt0aWRlZ2E/IFbDtWkgb24gdGVndSBpbnRlcmFrdGVlcnV2YXRlIGZha3Rvcml0ZWdhLCBtaWxsZXN0IG9zYWQgb24gcGFsanUgc3V1cmVtYXRlIG3DtWp1ZGVnYSB1dXJpdGF2YWxlIHR1bm51c2VsZSwga3VpIHRlaXNlZD8gw5xoZWwganVodWwgZWVsaXN0YXRlIHRlIG5vcm1hYWxqYW90dXNlIG11ZGVsZWlkLCB0ZWlzZWwganVodWwgcGVhdGUgw7VwcGltYSB0w7bDtnRhbWEga2EgbG9nbm9ybWFhbGphb3R1c2VnYS4KCkt1aSBtZSB2YWF0YW1lIHNhbXUgYW5kbWVpZCBsb2dhcml0bWlsaXNlcyBza2FhbGFzLCBhdmFzdGFtZSwgZXQgbmVlZCBhbmRtZWQgb24gbm9ybWFhbGphb3R1c2VnYS4KCmBgYHtyfQprYXN2IDwtIHJlcGxpY2F0ZSggMTAwMDAgLCBsb2cxMChwcm9kKCBydW5pZigxMiwxLDIpICkgKSApCmRlbnMoIGthc3YgKQpgYGAKCiMjIyNOb3JtYWFsamFvdHVzZSBtdWRlbCB2w6Rpa2VzdGVsIHZhbGltaXRlbAoKT2xldGFtZSwgZXQgbWVpbCBvbiBrb2xtIGFuZG1lcHVua3RpIG5pbmcgbWUgdXN1bWUsIGV0IG5lZWQgYW5kbWVkIG9uIGp1aHVzbGlrdWx0IHTDtW1tYXR1ZCBub3JtYWFsamFvdHVzZXN0IHbDtWkgc2VsbGVsZSBsw6RoZWRhc2VzdCBqYW90dXNlc3QuIE5vcm1hYWxqYW90dXNlIG11ZGVsaXQga2FzdXRhZGVzIG1lIHNpc3VsaXNlbHQgZGVrbGFyZWVyaW1lLCBldCBtZSB1c3VtZSwgZXQga3VpIG1lIG9sZWtzaW1lIG9sbnVkIHbDpGhlbSBsYWlzYWQgamEgMyBtw7XDtXRtaXNlIGFzZW1lbCBzb29yaXRhbnVrcyAzMDAwLCBzaWlzIG5lZWQgbcO1w7V0bWlzZWQgc29iaXR1a3NpZCBwaWlzYXZhbHQgaMOkc3RpIG1laWUgMyB2w6TDpHJ0dXNlIHBlYWwgZml0aXR1ZCBub3JtYWFsamFvdHVzZWdhLiBTZWVnYSwgbWUgdXN1bWUsIGV0IG9tYWRlcyAzIGFuZG1lcHVua3RpIG1lIHRlYW1lIGp1YmEgdW1ia2F1ZHUsIG1pbGxpc2VkIHR1bGVtdXNlZCBtZSBvbGVrc2ltZSBzYWFudWQga29yamF0ZXMgbsOkaXRla3MgMyBtaWxqb25pdCBhbmRtZXB1bmt0aS4gT21hIG11ZGVsaXN0IHbDtWltZSBzaW11bGVlcmlkYSDDvGtza8O1aWsga3VpIHBhbGp1IGFuZG1lcHVua3RlLiAKCkFnYSBwaWRhZ2UgbWVlbGVzLCBldCBzZWxsZSBtdWRlbGkgZml0dGltaXNla3Mga2FzdXRhbWUgbWUgYWludWx0IG5laWQgYW5kbWVpZCwgbWlzIG1laWwgcMOkcmlzZWx0IG9uIC0tLSBqYSBrdWkgbWVpbCBvbiBhaW51bHQgMyBhbmRtZXB1bmt0aSwgb24gdMO1ZW7DpG9saW5lLCBldCBmaXRpdHVkIG11ZGVsIGVpIGthamFzdGEgaMOkc3RpIHRlZ2VsaWtrdXN0LiAKCj4gSGFsdmFkIGFuZG1lZCBlaSBhbm5hIGt1bmFnaSBoZWFkIHR1bGVtdXN0LiAKCkVlbG5ldiBlaSBrZWh0aSBCYXllc2kgbXVkZWxpdGUga29odGEsIG1pcyB0b292YWQgcHJpb3JpdGUga2F1ZHUgc2lzc2UgbGlzYWluZm90LCBtaXMgZWkga2FqYXN0dSB2YWxpbWlhbmRtZXRlcyBqYSB2w7VpYiBhbmFsw7zDvHNpIHDDpMOkc3RhLgoKS3VpZGFzIHBhbm5hIHNrZXB0aWsgdXNrdW1hLCBldCBzdGF0aXN0aWxpc2VkIG1lZXRvZGlkIHTDtsO2dGF2YWQgaGFsdmFzdGkgdsOkaWtlc3RlbCB2YWxpbWl0ZWw/IFNpaW4gYWl0YWIgc2ltdWxhdHNpb29uLCBrdXMgbWUgdMO1bWJhbWUgMy1zZSB2YWxpbWkgZXR0ZWFudHVkIHBvcHVsYXRzaW9vbmlzdCBuaW5nIMO8cml0YW1lIHNlbGxlIHZhbGltaSBww7VoamFsIGVubnVzdGFkYSBzZWxsZWFzYW1hIHBvcHVsYXRzaW9vbmkgc3RydWt0dXVyaS4gS3VuYSB0ZWdlbWlzdCBvbiBzaW11bGF0c2lvb25pZ2EsIHRlYW1lIHTDpHBzZWx0LCBldCBwb3B1bGF0c2lvb24sIGt1c3QgbWUgdMO1bWJhbWUgb21hIGtvbG1lc2UgdmFsaW1pLCBvbiBub3JtYWFsamFvdHVzZWdhLCBldCB0ZW1hIGtlc2t2w6TDpHJ0dXMgPSAwIGphIGV0IHRlbWEgc2QgPSAxLiBNZSBmaXRpbWUgb21hIHZhbGltaSBhbmRtZXRlZ2EgMiBlcmluZXZhdCBtdWRlbGl0OiBub3JtYWFsamFvdHVzZSBqYSBTdHVkZW50aSB0IGphb3R1c2UuIAogIApgYGB7ciBlY2hvPUZBTFNFfQpsaWJyYXJ5KGJybXMpICN0IGphb3R1c2UgbW9kZWxsZWVyaW1pc2VrcwpsaWJyYXJ5KGdndGhlbWVzKQojcGFrZXR0IGdnZm90aWZ5IHBha3ViIGFsdCBsYWhlbmR1c3QgamFvdHVzdGUgam9vbmlzdGFtaXNla3MKc2V0LnNlZWQoMTkpCmRmIDwtIHRpYmJsZShhPXJub3JtKDMpKQoKZGYgJT4lIGdncGxvdChhZXMoeD1hKSkgKwogIGdlb21fZG90cGxvdCgpICsgCiAgc3RhdF9mdW5jdGlvbihmdW49ZG5vcm0sIGFyZ3M9bGlzdChtZWFuPW1lYW4oZGYkYSksc2Q9c2QoZGYkYSkpLCBjb2xvdXI9InJlZCIpICsKICBzdGF0X2Z1bmN0aW9uKGZ1bj1kbm9ybSwgYXJncz1saXN0KG1lYW49MCwgc2Q9MSksIGNvbG91cj0iYmx1ZSIpICsKICBzdGF0X2Z1bmN0aW9uKGZ1bj1kc3R1ZGVudF90LCBhcmdzPWxpc3QoZGY9MiwgbXU9bWVhbihkZiRhKSwgc2lnbWE9c2QoZGYkYSkpKSsKICB4bGltKC0zLCAzKSArIHlsaW0oMCwgMC41NSkgKyBsYWJzKHg9TlVMTCwgeT1OVUxMKSArIHRoZW1lX3R1ZnRlKCkKYGBgCgoqSm9vbmlzOiBqdWh1dmFsaW0gbm9ybWFhbGphb3R1c2VzdCwgbWlsbGUga2Vza21pbmU9MCBqYSBzZD0xIChuPTM7IGFuZG1lcHVua3RpZCBvbiBuw6RpZGF0dWQgbXVzdGFkZSBtdW5hZGVuYSkuIFNpbmluZSBqb29uIC0gcG9wdWFsdHNpb29uLCBtaWxsZXN0IHTDtW1tYXRpIHZhbGltOyBwdW5hbmUgam9vbiAtIG5vcm1hYWxqYW90dXNlIG11ZGVsLCBtaXMgb24gZml0aXR1ZCB2YWxpbWkgYW5kbWV0ZWw7IG11c3Qgam9vbiAtIFN0dWRlbnRpIHQgamFvdHVzZSBtdWRlbCwgbWlzIG9uIGZpdGl0dWQgc2FtYWRlIGFuZG1ldGVnYS4qCgpNw7VsZW1hZCBtdWRlbGlkIG9uIHPDvHN0ZW1hYXRpbGlzZWx0IG5paHV0YXR1ZCB2w6Rpa3NlbWF0ZSB2w6TDpHJ0dXN0ZSBwb29sZSBqYSBhbGFoaW5kYXZhZCB2YXJpZWVydXZ1c3QuIHQgamFvdHVzZSBtdWRlbCBvbiBvb2RhdHVsdCBwYWtzZW1hdGUgc2FiYWRlZ2EgamEgZW5udXN0YWIgMC1zdCBrYXVnZWxlIHBhbGp1IHJvaGtlbSB2w6TDpHJ0dXNpIGt1aSBub3JtYWFsamFvdHVzZSBtdWRlbC4gS3VuYSBtZSB0ZWFtZSwgZXQgcG9wdWxhdHNpb29uIG9uIG5vcm1hYWxqYW90dXNlZ2EsIHBvbGUgdsOkZ2Egw7xsbGF0YXYsIGV0IHQgamFvdHVzIG1vZGVsZWVyaWIgc2VkYSBoYWx2ZW1pbmkga3VpIG5vcm1hYWxqYW90dXMuIAoKSWdhbCBqdWh1bCwgbcO1bmkgdGVpbmUganVodXZhbGltIGFubmFrcyBtZWlsZSBob29waXMgdGVpc3RzdWd1c2VkIG11ZGVsaWQsIG1pcyByb2hrZW0gdsO1aSB2w6RoZW0gZXJpbmV2YWQgYWxnc2VzdCBwb3B1bGF0c2lvb25pc3QuCgpNaXMganVodHViIGt1aSBtZSBrYXN1dGFtZSBvbWEgbm9ybWFhbGphb3R1c2UgbXVkZWxpdCB1dXRlIGFuZG1ldGUgc2ltdWxlZXJpbWlzZWtzPyBLdWkgbMOkaGVkYXNlZCBvbiBuZWVkIHNpbXVsZWVyaXR1ZCBhbmRtZWQgcG9wdWxhdHNpb29uaSBhbmRtZXRlZ2EgamEga3VpIGzDpGhlZGFzZWQgdmFsaW1pIGFuZG1ldGVnYSwgbWlsbGVnYSBtZSBub3JtYWFsamFvdHVzZSBtdWRlbGkgZml0dGlzaW1lPwoKYGBge3J9CnNldC5zZWVkKDE5KSAjbXV1ZGFiIHNpbXVsYXRzaW9vbmkga29ycmF0YXZha3MKI3TDtW1iYW1lIDMganVodXNsaWtrdSBhcnZ1IG5vcm1hYWxoYW90dXNlc3QsIG1pbGxlIGtlc2t2w6TDpHJ0dXMgPSAwIGphIHNkID0gMS4KZGYgPC0gdGliYmxlKHNhbXBsZV9kYXRhPXJub3JtKDMpKSAKI2ZpdGltZSBub3JtYWFsamFvdHVzZSBtdWRlbGkgdmFsaW1pIGtlc2ttaXNlIGphIHNkLWdhCm1lYW4oZGYkc2FtcGxlX2RhdGEpOyBzZChkZiRzYW1wbGVfZGF0YSkKI3NpbXVsZWVyaW1lIDEwMDAgdXV0IGFuZG1lcHVua3RpIGZpdGl0dWQgbXVkZWxpc3QKc2ltdWxhdGVkX2RhdGEgPC0gcm5vcm0oMTAwMCwgbWVhbihkZiRzYW1wbGVfZGF0YSksIHNkKGRmJHNhbXBsZV9kYXRhKSkKI2FydnV0YW1lIHNpbXVsZWVyaXR1ZCBhbmRtZXRlIGtlc2ttaXNlIGphIHNkIG5pbmcgam9vbmlzdGFtZSBuZWlzdCBoaXN0b2dyYW1taQptZWFuKHNpbXVsYXRlZF9kYXRhKTsgc2Qoc2ltdWxhdGVkX2RhdGEpOyBoaXN0KHNpbXVsYXRlZF9kYXRhKQpgYGAKCk5hZ3UgbsOkaGEsIG9uIHV1dGUgKHNpbXVsZWVyaXR1ZCkgYW5kbWV0ZSBrZXNrdsOkw6RydHVzIGphIFNEIHbDpGdhIHNhcm5hc2VkIGFsZ3NldGUgYW5kbWV0ZSBvbWFsZSwgbWlkYSBrYXN1dGFzaW1lIG11ZGVsaSBmaXR0aW1pc2VsLiBLYWhqdWtzIGVpIG9sZSBuZWVkIGFnYSBrYXVnZWx0a2kgbmlpIHNhcm5hc2VkIGFsZ3NlbGUgamFvdHVzZWxlLCBtaWxsZSBrdWp1IG1lIHDDvMO8YW1lIG9tYSBhbmRtZXRlIGphIG11ZGVsaSBwZWFsdCBlbm51c3RhZGEuIFNlZWdhIG9uIG1laWUgbXVkZWwgw7xsZS1maXR0aXR1ZCwgbWlzIHTDpGhlbmRhYiwgZXQgdGEga2FqYXN0YWIgbGlpZ3NlbHQgbmVpZCB2YWxpbWkgYXNwZWt0ZSwgbWlzIGVpIHBlZWdlbGRhIGFsZ3NlIHBvcHVsYXRzaW9vbmkgb21hZHVzaS4gTG9vbXVsaWt1bHQgZWkgdmFzdGEgw7xrc2tpIG11ZGVsIHDDpHJpc2VsdCB0ZWdlbGlra3VzZWxlLiBLw7xzaW11cyBvbiBwaWdlbSBzZWxsZXMsIGthcyBtw7VuaSBtZWllIG11ZGVsaXRlc3Qgb24gcGlpc2F2YWx0IGhlYSwgZXQgb2xsYSBrYXN1bGlrLiBWYXN0dXMgc2VsbGVsZSBzw7VsdHViLCBtaWxsZWtzIHBsYWFuaW1lIG9tYSBtdWRlbGl0IGthc3V0YWRhLgoKYGBge3J9Cm1lYW4oc2ltdWxhdGVkX2RhdGE+MCk7IG1lYW4oc2ltdWxhdGVkX2RhdGE+MSkKYGBgCkt1aSBwb3B1bGF0c2lvb25pdsOkw6RydHVzdGVzdCBvbiA1MCUgc3V1cmVtYWQga3VpIDAsIHNpaXMgbXVkZWxpIGrDpHJnaSB2YWV2YWx0IDMyJS4gS3VpIHBvcHVsYXRzaW9vbml2w6TDpHJ0dXN0ZXN0IG9uIDE2JSBzdXVyZW1hZCBrdWkgMSwgc2lpcyBtdWRlbGkgasOkcmdpIHZhZXZhbHQgNCUuClNlZSBpbGx1c3RyZWVyaWIgaMOkc3RpIG11ZGVsaSBrdmFsaXRlZXRpLgoKYGBge3J9CmxpYnJhcnkoYnJtcykKc2ltX3QgPC0gcnN0dWRlbnRfdCgxMDAwLCAyLCBtZWFuKGRmJHNhbXBsZV9kYXRhKSwgc2QoZGYkc2FtcGxlX2RhdGEpKQptZWFuKHNpbV90PjApOyBtZWFuKHNpbV90PjEpCmBgYApTYW1hZCBlbm51c3R1c2VkIHQgamFvdHVzZXN0IG9uIGlzZWdpIHBhcmVtYWQhIEFnYSBrdW1iIG9uIGlra2FnaSBwYXJlbSBtdWRlbCBwb3B1bGF0c2lvb25pbGU/CgoKIyMgMi42LiBub3JtYWFsamFvdHVzZSBqYSBsb2dub3JtYWFsamFvdHVzZSBlcmlsaXN1cwoKTm9ybWFhbGphb3R1cyBqYSBsb2dub3JtYWFsamFvdHVzIG9uIGVyaWxpc2VkIHNlc3QgCgooMSkga2Vza25lIHBpaXJ0ZW9yZWVtIMO8dGxlYiwgZXQgb2xndSB0ZWllIHZhbGltIMO8a3Nrw7VpayBtaWxsaXNlIGphb3R1c2VnYSwgcGFsanVkZXN0IHZhbGltaXRlc3QgYXJ2dXRhdHVkICoqYXJpdG1lZXRpbGlzZWQga2Vza21pc2VkKiogb24gYWxhdGkgZW5hbS12w6RoZW0gbm9ybWFhbGphb3R1c2VnYSAoa3VpIG4+MzApLiBTZWxsZSBtYXRlbWFhdGlsaXNlIGZvcm1hbGlzbWkgdHVsZXR1cyBmw7zDvHNpa2FsaXNzZSBtYWFpbG1hIG9uIG5uICJlbGVtZW50YWFyc2V0ZSB2aWdhZGUgaMO8cG90ZWVzIiwgbWlsbGUga29oYXNlbHQgcGFsanVkZSB2w6Rpa2VzdGUgw7xrc3RlaXNlc3Qgc8O1bHR1bWF0dXRlIGp1aHVzbGlrZSBlZmVrdGlkZSAodmlnYWRlKSBzdW1tYSBhbm5hYiB0dWxlbXVzZWtzIG5vcm1hYWxqYW90dXNlLiBQYXJha3UgYW5uYXZhZCBlbmFtdXMgYmlvbG9vZ2lsaXNpIG3DtcO1dG1pc2kgZXJhbmRpdHVsdCBtaXR0ZS1uZWdhdGlpdnNlaWQgdHVsZW11c2kuIFNhZ2VsaSBvbiBzZWxsaXN0ZSBtw7XDtXRtaXN0ZSB0dWxlbXVzdGUgamFvdHVzZWQgZWJhc8O8bW1lZXRyaWxpc2VkICh2LmEuIHNpaXMsIGt1aSBjdiA9IHNkL21lYW4gb24gdsOkaWtlKSBqYSBzaWlzIG9uIG1laWwgc2FnZWxpIHRlZ3UgbG9nbm9ybWFhbGphb3R1c2VnYSwgbWlzIHRla2tpYiBsb2ctbm9ybWFhbHNldGUgbXV1dHVqYXRlIGtvcnJ1dGFtaXNlc3QgKG1pdHRlIGxpaXRtaXNlc3QsIG5hZ3Ugbm9ybWFhbGphb3R1c2UgcHVodWwpLiBLZXNrbmUgcGlpcnRlb3JlZW0gMjogc3V2YWxpc2UgamFvdHVzZWdhIG11dXR1amF0ZSAqKmdlb21lZXRyaWxpc2VkIGtlc2ttaXNlZCoqIG9uIGxvZ25vcm1hYWxqYW90dXNlZ2EuIEVsZW1lbnRhYXJzZXRlIHZpZ2FkZSBow7xwb3RlZXMgMjogS3VpIGp1aHVzbGlrIHZhcmllZXJ1dnVzIHRla2liIHBhbGp1ZGUganVodXNsaWtlIGVmZWt0aWRlIGtvcnJ1dGFtaXNlbCwgb24gdHVsZW11c2VrcyBsb2dub3JtYWFsamFvdHVzLiBMb2dub3JtYWFsamFvdHVzZSBlbGVtZW50aWRlIChhcnZ1ZGUpIGxvZ2FyaXRtaW1pc2VsIHNhYW1lIG5vcm1hYWxqYW90dXNlLiAKCigyKSBNw7VsZW1hZCBqYW90dXNlZCAobm9ybWFhbCBqYSBsb2dub3JtYWFsKSBvbiBtYWtzaW1hYWxzZSBlbnRyb29waWFnYSBqYW90dXNlZC4gRW50cm9vcGlhdCB2YWFkZWxkYWtzZSBzaWluIGluZm9ybWF0c2lvb25pL23DvHJhIGthdWR1IC0tLSBtYWtzaW1hYWxzZSBlbnRyb29waWFnYSBzw7xzdGVlbSBzaXNhbGRhYiBtYWtzaW1hYWxzZWx0IG3DvHJhIGphIG1pbmltYWFsc2VsdCBpbmZvcm1hdHNpb29uaSAoU2hhbm5vbmkgaW5mb3JtYXRzaW9vbml0ZW9vcmlhKS4gU2VlIHTDpGhlbmRhYiwgZXQgdsOkbGphc3Bvb2wgb21hIHBhcmFtZWV0cml0ZSB0dXVuaXR1ZCB2w6TDpHJ0dXNpIG9uIG5lZWQgbm9ybWFhbC0gamEgbG9nbm9ybWFhbGphb3R1c2VkIG1pbmltYWFsc2VsdCBpbmZvcm1hdGlpdnNlZC4gTsOkaXRla3Mgbm9ybWFhbGphb3R1c2VsIG9uIGtha3MgcGFyYW1lZXRyaXQsIG11IGphIHNpZ21hIChlaGsga2Vza21pbmUgamEgc3RhbmRhcmRow6RsdmUpLiBTZWVnYSwgYW5kZXMgbm9ybWFhbGphb3R1c2VsZSBldHRlIGtlc2t2w6TDpHJ0dXNlIGphIHN0YW5kYXJkaMOkbGJlIGZpa3NlZXJpbWUgw7xoZXNlbHQgamFvdHVzZSBlaGsgbXVkZWxpIGt1anUgamEgc2FtYXMgbGlzYW1lIHNpbm5hIG1pbmltYWFsc2VsdCBtdXVkIChzb292aWFtdHV0KSBpbmZvcm1hdHNpb29uaS4gVGVpc2VkIG1ha3NpbWFhbHNlIGVudHJvb3BpYWdhIGphb3R1c2VkIG9uIGVrc3BvbmVudHNpYWFsbmUgamFvdHVzLCBiaW5vb21qYW90dXMgamEgcG9pc3NvbmkgamFvdHVzLiBNYWtzaW1hYWxzZSBlbnRyb29waWFnYSBqYW90dXNlZCBzb2JpdmFkIGjDpHN0aSBCYXllc2kgcHJpb3JpdGVrcyBzZXN0IG1lIHN1dWRhbWUgcGFyZW1pbmkga29udHJvbGxpZGEsIG1pbGxpc3QgaW5mb3JtYXRzaW9vbmkgbWUgbmVpc3NlIHN1cnVtZS4gCgoKIyMgMi43LiBLw7xzaW11c2VkLCBtaWRhIHN0YXRpc3Rpa2Ega8O8c2liCgpTdGF0aXN0aWthIGFiaWwgc2FhYiB2YXN0dXNlaWQgasOkcmdtaXNldGVsZSBrw7xzaW11c3RlbGU6CgoxKSAga3VpZGFzIG7DpGV2YWQgdsOkbGphIHRlaWUgYW5kbWVkIGVoayBtaWxsaW5lIG9uIGp1c3QgdGVpZSBhbmRtZXRlIGphb3R1cywga2Vza3bDpMOkcnR1cywgdmFyaWVlcnV2dXMgamEga29vcy12YXJpZWVydXZ1cz8gTsOkaXRla3MsIG3DtcO1ZGV0dWQgcGlra3VzdGUgamEga2FhbHVkZSBrb29zLXZhcmllZXJ1dnVzdCBzYWFiIG3DtcO1dGEga29ycmVsYXRzaW9vbmlrb3JkYWphIGFiaWwuCgoyKSAgbWlkYSBtZSBwZWFrc2ltZSB0ZWllIHZhbGltaSBhbmRtZXRlIHDDtWhqYWwgdXNrdW1hIHBvcHVsYXRzaW9vbmkgcGFyYW1lZXRyaSB0ZWdlbGlrdSB2w6TDpHJ0dXNlIGtvaHRhPyBOw6RpdGVrcywga3VpIG1laWUgYW5kbWV0ZSBww7VoamFsIGFydnV0YXR1ZCBrZXNrbWluZSBwaWtrdXMgb24gMTc4IGNtLCBzaWlzIGt1aSBwYWxqdSBvbiBtZWlsIHDDtWhqdXN0IGFydmF0YSwgZXQgdGVnZWxpayBwb3B1bGF0c2lvb25pIGtlc2ttaW5lIHBpa2t1cyA+IDE4NSBjbT8KCjMpICBtaWRhIMO8dGxlYiBzdGF0aXN0aWxpc2UgbXVkZWxpIHN0cnVrdHV1ciB0ZWFkdXNsaWt1IGjDvHBvdGVlc2kga29odGE/IE7DpGl0ZWtzLCBrdWkgbWVpZSBwb29sdCBtw7XDtWRldHVkIHBpa2t1c3RlIGphIGthYWx1ZGUga29vcy12YXJpZWVydXZ1c3Qgc2FhYiBow6RzdGkga2lyamVsZGFkYSBraW5kbGF0IHTDvMO8cGkgbGluZWFhcnNlIHJlZ3Jlc3Npb29uaW11ZGVsaWdhLCBzaWlzIG9uIG1laWwgZWhrIHTDtWVuZHVzbWF0ZXJqYWxpLCBldCBwaWtrdXMgamEga2FhbCBvbiBvbWF2YWhlbCBzZWxsaXNlbCB2aWlzaWwgc2VvdHVkIGphIGVlbGlzdGF0dWQgcGVha3Mgb2xlbWEgdGVhZHVzbGlrIHRlb29yaWEsIG1pcyBqdXN0IHNlbGxpc2Ugc2Vvc2UgdGVra2ltaXNlbGUgYmlvbG9vZ2lsaXNlIG1laGhhbmlzbWkgYW5uYWIuCgo0KSBtaWRhIGVubnVzdGFiIG11ZGVsIHR1bGV2aWt1IGtvaHRhPyBOw6RpdGVrcywgbWVpZSBsaW5lYWFybmUgcGlra3VzZS1rYWFsdSBtdWRlbCBzdXVkYWIgZW5udXN0YWRhIHR1bGV2aWt1cyBrb2d1dGF2YWlkIHBpa2t1c2UgYW5kbWVpZC4gQWdhIGt1aSBow6RzdGk/Cgo+IHN0YXRpc3Rpa2Egw7xsZXNhbm5lIG9uIGzDpGh0dXZhbHQgcGlpcmF0dWQgaHVsZ2FzdCBhbmRtZXRlc3QgamEgbXVkZWxpdGVzdCBrdmFudGlmaXRzZWVyaWRhIHBhcmltYWwgdsO1aW1hbGlrdWwgdmlpc2lsIGvDtWhlZHVzdCwgbWlkYSBwZWFrc2ltZSB0dW5kbWEgdmFzdGF0ZXMgZWVsdG9vZHVkIGvDvHNpbXVzdGVsZS4KClN0YXRpc3Rpa2EgZWkgdmFzdGEgb3RzZSB0ZWFkdXNsaWtlbGUga8O8c2ltdXN0ZWxlIGVnYSBrw7xzaW11c3RlbGUgcMOkcmlzIG1hYWlsbWEga29odGEuIFN0YXRpc3RpbGlzZWQgdmFzdHVzZWQgasOkw6R2YWQgYWxhdGkga2FzdXRhdHVkIGFuZG1ldGUgamEgbXVkZWxpdGUgcGlpcmlkZXNzZS4gU2VsbGVnYSBzZW9zZXMgcGVha3NpbWUgZWVsaXN0YW1hIGjDpHN0aSBrb2d1dHVkIHJpa2thbGlra2UgYW5kbWVpZCBqYSBwYWluZGxpa2tlIG11ZGVsZWlkLiBTaWlzIG9uIGxvb3R1c3QsIGV0IGjDvHBlIG11ZGVsaSBrb2VmaXRzaWVudGlkZXN0IHDDpHJpcyBtYWFpbG1hIGtpcmplbGRhbWlzc2UgdHVsZWIgw7xsZSBraXRzYW1hIGt1cmlzdGlrdS4gQmF5ZXNpbCBvbiBzaWluIGVlbGlzLCBzZXN0IG9zYXYgc3RhdGlzdGlrIHN1dWRhYiBrb29zdMO2w7ZzIHRlYWRsYXN0ZWdhIHByaW9yaSBtdWRlbGlzc2Uga8O8bGxhbHQgcGFsanUga2FzdWxpa2t1IGluZm90IGtvZ3VkYS4gU2FtYXMsIGFtYXTDtsO2ciBzdXVkYWIgYmF5ZXNpIGFiaWwgc2FtYXbDtXJyYSBrw6Rra2kga2VlcmF0YS4gTWlkYSBwYWluZGxpa3VtIG9uIG1lZXRvZCwgc2VkYSB2w6RoZW0gYXV0b21hYXRuZSBvbiBzZWxsZSBtw7Vpc3RsaWsga2FzdXRhbWluZS4KCiMgMy4gS3VpZGFzIG7DpGV2YWQgdsOkbGphIHRlaWUgYW5kbWVkPwoKIyMgMy4xLiBzdW1tYWFyc2VkIHN0YXRpc3Rpa3VkCgpTdW1tYWFybmUgc3RhdGlzdGlrID0gw7xrcyBudW1iZXIuICAKTWlsbGlzZWlkIHN0YXRpc3Rpa3VpZCBhcnZ1dGFkYSBqYSBtaWxsaXNlaWQgdsOkbHRpZGEsIHPDtWx0dWIgc3RhdGlzdGlsaXNlc3QgbXVkZWxpc3QgCgo+IHN1bW1hYXJzZSBzdGF0aXN0aWthIGFiaWwgaXNlbG9vbXVzdGFtZSBhKSB0w7zDvHBpbGlzdCB2YWxpbWkgbGlpZ2V0IChrZXNrbWlzdCksIGIpIG11dXR1amEgc2lzZXN0IHZhcmllZXJ1dnVzdCwgYykgZXJpbmV2YXRlIG11dXR1amF0ZSAocGlra3VzLCBrYWFsIHZtcykga29vcy12YXJpZWVydXZ1c3QKCiMjIyAzLjEuMS4ga2Vza3bDpMOkcnR1c2VkCgpLZXNrdsOkw6RydHVzdCBzYWFiIG3DtcO1dGEgcGFhcmlsIHRvc2luYWwgZXJpbmV2YWwgdmlpc2lsLCBtaWxsZXN0IGrDpHJnbmV2YWx0IGthc3V0YW1lIGtvbG1lIHbDtWkgbmVsamEuIEVubmUga3VpIHRlIGFydnV0YW1hIGt1a3V0ZSwgbcO1ZWxnZSBqw6RyZWxlLCBtaWtzIHRlIHNvb3ZpdGUga2Vza3bDpMOkcnR1c3QgdGVhZGEuIEthcyB0ZWlkIGh1dml0YWIgdmFsaW1pIHTDvMO8cGlsaW5lIGxpaWdlPyBLdWlkYXMgdGUgc29vdmlrc2l0ZSBzZWRhIHTDvMO8cGlsaXN1c3QgZGVmaW5lZXJpZGE/IEthcyB2YWxpbWkga2Vza21pc2UgbGlpa21lbmEgdsO1aSB2YWxpbWkga8O1aWdlIGFydnVrYW1hIGxpaWttZW5hPyB2w7VpIHZlZWwga3VpZGFnaT8gU2VlLCBtaWxsaXN0IGtlc2t2w6TDpHJ0dXN0IGthc3V0YWRhIHPDtWx0dWIgc2FnZWxpIGFuZG1lamFvdHVzZSBrdWp1c3QuIFPDvG1tZWV0cmlsaXNpIGphb3R1c2kgb24gbGlodHNhbSBpc2Vsb29tdXN0YWRhIGphIG1pdG1ldGlwdWxpc2VkIGphb3R1c2VkIG9uIHNlbGxlcyBvc2FzIGvDtWlnZSBrZWh2ZW1hZC4KCk1pbmEgZWVsaXN0YW4gc2VsbGlzZWlkIG7DtXVhbmRlaWQgKG1pcyBvbiByYW5nZWx0IHNvb3ZpdHVzbGlrdWQpOgoKKDEpIEt1aSB2YWxpbSBvbiBub3JtYWFsamFvdHVzZWdhIChoaXN0b2dyYW1tIG9uIHPDvG1tZWV0cmlsaW5lKSwgaGluZGEgdMO8w7xwaWxpc3QgbGlpZ2V0IGzDpGJpIGFyaXRtZWV0aWxpc2Uga2Vza21pc2UgKG1lYW4pLiAgCgooMikgTXVpZHUga2FzdXRhIG1lZGlhYW5pIChtZWRpYW4pLiBLdWkgdmFsaW0gb24gbGlpZ2EgdsOkaWtlLCBldCBqYW90dXN0IGhpbm5hdGEgKGFnYSA+IDQpLCBlZWxpc3RhIG1lZGlhYW5pLiBNZWRpYWFuaSBzYWFtaXNla3MgasOkcmplc3RhdGFrc2UgbcO1w7VkZXR1ZCB2w6TDpHJ0dXNlZCBzdXVydXNlIGrDpHJnaSBqYSB2w7VldGFrc2Ugc2VsbGUgcmVhIGtlc2ttaW5lIGxpaWdlLiBNZWRpYWFuIG9uIHbDpGhlbSB0dW5kbGlrIGVrc3RyZWVtc2V0ZSB2w6TDpHJ0dXN0ZSAob3V0bGllcml0ZSkgc3VodGVzIGt1aSBtZWFuLiAKCigzKSBWYWxpbWkga8O1aWdlIGxldmludW1hdCBlc2luZGFqYXQgaXNlbG9vbXVzdGFiIG1vb2QgZWhrIGphb3R1c2UgdGlwcC4gU2VkYSBvbiBhZ2EgcmFza2VtIHTDpHBzZWx0IG3DpMOkcmF0YSBqYSBtaXRtZXRpcHVsaXNlbCBqYW90dXNlbCBvbiBtaXR1IG1vb2RpLiBUw7bDtnRhbWlzZWwgcG9zdGVyaW9vcnNldGUgamFvdHVzdGVnYSBvbiBtb29kIHNhZ2VsaSBwYXJpbSBsYWhlbmR1cy4gCgpgYGB7ciBlY2hvPUZBTFNFfQphbmRtZWQgPC0gcmxub3JtKDEwMCkKI21lYW4oYW5kbWVkKTsgbWVkaWFuKGFuZG1lZCkKCm1vZGUgPC0gIGZ1bmN0aW9uKHgsIGFkanVzdD0xKSB7CiAgeCA8LSBuYS5vbWl0KHgpCiAgZHggPC0gZGVuc2l0eSh4LCBhZGp1c3Q9YWRqdXN0KQp5X21heCA8LSBkeCR4W3doaWNoLm1heChkeCR5KV0gCnlfbWF4Cn0KbW9kZShhbmRtZWQpCgpwbG90KGRlbnNpdHkoYW5kbWVkLCBhZGp1c3Q9MSkpCmFibGluZSh2PW1vZGUoYW5kbWVkKSwgY29sPSJyZWQiKQphYmxpbmUodj1tZWRpYW4oYW5kbWVkKSwgY29sPSJibHVlIikKYWJsaW5lKHY9bWVhbihhbmRtZWQpKQoKYGBgCkpvb25pczogU2ltdWxlZXJpdHVkIGxvZ25vcm1hYWxqYW90dXNlZ2EgYW5kbWVkLiBQdW5hbmUgam9vbiAtIG1vb2Q7IHNpbmluZSBqb29uIC0gbWVkaWFhbjsgbXVzdCBqb29uIC0gYXJpdG1lZXRpbGluZSBrZXNrbWluZSAobWVhbikuIE1pbGxpbmUgbmVpc3QgdmFzdGFiIHBhcmltaW5pIHRlaWUgaW50dWl0c2lvb25pZ2EgbmVuZGUgYW5kbWV0ZSAia2Vza3bDpMOkcnR1c2VzdCI/IE1pa3M/CgoKCiMjIyAzLjEuMi4gbXV1dHVqYSBzaXNlbmUgdmFyaWVlcnV2dXMKCk1lYW4taWdhIGvDpGliIGtva2t1IHN0YW5kYXJkaMOkbHZlIChTRCkuIAoKU0Qgb24gc2FtYSDDvGhpa3VnYSwgbWlzIGFuZG1lZCAoamEgYW5kbWV0ZSBrZXNrdsOkw6RydHVzKS4gU3RhdGlzdGlrdXRlIGh1bGdhcyBlZWxpc3RhdHVkIGZvcm1hYXQgb24gbWVhbiAoU0QpLCBtaXR0ZSBtZWFuICgrLy0gU0QpLiAxIFNEIGthdGFiIDY4JSBub3JtYWFsamFvdHVzZXN0LCAyIFNEIOKAkyA5NiUgamEgMyBTRCDigJMgOTklLiBOb3JtYWFsamFvdHVzIGxhbmdlYiBzZXJ2YWRlcyBraWlyZXN0aSwgbWlzIHTDpGhlbmRhYiwgZXQgdGFsIG9uIHBlZW5pa2VzZWQgc2FiYWQgamEgbsOkaXRla3MgNSBTRCBrYXVndXNlbCBrZXNrbWlzZXN0IHBhaWtuZWIgdmFpZCDDvGtzIHB1bmt0IG1pbGpvbmlzdC4gCgpOw6RpdGVrczogaW5pbWVzdGUgSVEgb24gbm9ybWFhbGphb3R1c2VnYSwgbWVhbj0xMDAsIHNkPTE1LiBTZWUgdMOkaGVuZGFiLCBldCBrdWkgc2ludSBJUT0xMTUgKMO8bGlrb29saSBhc3R1amF0ZSBrZXNrbWluZSBJUSksIHNpaXMgb24gdMO1ZW7DpG9zdXMsIGV0IGp1aHVzbGlrdWx0IGtvaGF0dWQgaW5pbWVuZSBvbiBzaW51c3QgbnV0aWthbSwgMTglICgoMTAwJSAtIDY4JSkvMiAgPSAxOCUpLiAKCkt1aSBhZ2Eg4oCcdGVnZWxpa3Vs4oCdIGFuZG1lamFvdHVzZWwgb24g4oCccGFrcyBzYWJh4oCdIHbDtWkgZXNpbmV2YWQgb3V0bGllcmlkLCBzaWlzIG5vcm1hYWxqYW90dXN0IGVlbGRhdiBtdWRlbCB0YWdhYiDDvGxlaGlubmF0dWQgU0QgamEgc2VlZ2Egw7xsZWhpbm5hdHVkIHZhcmllZXJ1dnVzZS4gS3VpIGFuZG1lZCBzYWF2YWQgb2xsYSBhaW51bHQgcG9zaXRpaXZzZWQsIHNpaXMgU0QgPiBtZWFuLzIgdmlpdGFiLCBldCBhbmRtZWQgZWkgc29iaSBub3JtYWFsamFvdHVzZSBtdWRlbGlnYSAoc2VzdCBtdWRlbCBlbm51c3RhYiBuZWdhdGlpdnNldGUgYW5kbWV0ZSBlc2luZW1pc3Qga8O8bGxhbHQgc3V1cmUgc2FnZWR1c2VnYSkuIAoKICAgIE5vcm1hYWxqYW90dXMgb24gZGVmaW5lZXJpdHVkIGthIG3DtW5lZGUgdGVpc3RlIGphb3R1c3RlIGphb2tzIHBlYWxlIG5vcm1hYWxqYW90dXNlIAogICAgKFBvaXNzaW9uaSBqYW90dXMsIGJpbm9vbWphb3R1cykuIAogICAgRnVua3RzaW9vbiBzZCgpIGphIHNlbGxlIHRhZ2Egb2xldiB2YWxlbSwgbWlzIG9uIGxvb2R1ZCBub3JtYWFsamFvdHVzZSB0YXJiZWtzLCAKICAgIGphIG5laWQgYWx0ZXJuYXRpaXZzZWlkIHN0YW5kYXJkaMOkbGJlaWQgZWkgYXJ2dXRhLiAKICAgIFNlZWdhIHRhc3ViIG1lZWxlcyBwaWRhZGEsIGV0IHRhdmFww6RyYW5lIHNkIGtlaHRpYiBub3JtYWFsamFvdHVzZSBtdWRlbGkgcGlpcmlkZXMgamEgZWkga3VzYWdpbCBtdWphbCEKCkt1aSBhbmRtZWQgZWkgc29iaSBub3JtYWFsamFvdHVzZXNzZSBzaWlzIHbDtWliIHBha2t1ZGEga2FodGUgYWx0ZXJuYXRpaXZzZXQgbGFoZW5kdXN0OiAKCiMjIyMJKDEpIGxvZ2FyaXRtaSBhbmRtZWQuIAoKS3VpIGxvZ2FyaXRtaW1pbmUgbXV1ZGFiIGFuZG1lZCBub3JtYWFsc2Vrcywgc2lpcyBzYWFiIGxvZ2FyaXRtaXR1ZCBhbmRtZXRlc3QgYXJ2dXRhZGEgbWVhbi1pIGphIFNEIGphIHNlZWrDpHJlbCBtw7VsZW1hZCBhbnRpLWxvZ2FyaXRtaWRhLiBTZWxsaXNlbCBqdWh1bCBhdmFsZGFkIHNhIGzDtXB1a3MgZ2VvbWVldHJpbGlzZSBrZXNrbWlzZSBqYSBtdWx0aXBsaWthdGlpdnNlIFNEIChtdWx0aXBsaWthdGlpdm5lIFNEID0gZ2VvbSBtZWFuIHggU0Q7IGdlb20gbWVhbi9TRCkuIEdlb21lZXRyaWxpbmUga2Vza21pbmUgb24gYWxhdGkgdsOkaWtzZW0ga3VpIGFyaXRtZWV0aWxpbmUga2Vza21pbmUuIExpc2FrcyBvbiBTRCBpbnRlcnZhbCBuw7zDvGQgYXPDvG1tZWV0cmlsaW5lIGphIFNEIG9uIGFsYXRpID4gMC4gTmFndSBlbm5lZ2ksIDY4JSBsb2dub3JtYWFsc2V0ZXN0IGFuZG1ldGVzdCBqw6TDpGIgMVNEIHZhaGVtaWtrdSBuaW5nIDk1LjUlIGFuZG1ldGVzdCBqw6TDpGIgMlNEIHZhaGVtaWtrdS4KCmxvZ25vcm1hYWxzZXRlIGFuZG1ldGUgdGF2YXDDpHJhbmUgaXNlbG9vbXVzdHVzIGtlc2ttaXNlIGphIHN0YW5kYXJkaMOkbGJlZ2E6IG1lYW4oc2QpIG9uIDEuOCgxLjkpLiBTZWUgc2QgaW50ZXJ2YWwgb24gc8O8bW1lZXRyaWxpbmUsIGVoa2tpIGFuZG1ldGUgamFvdHVzIG9uIHbDpGdhZ2kgZWJhc8O8bW1lZXRyaWxpbmUuIExpc2FrcyBlbm51c3RhYiBzdGFuZGFyZGjDpGx2ZSwgbWlzIG9uIHN1dXJlbSBrdWkga2Vza3bDpMOkcnR1cywgc3V1cmUgc2FnZWR1c2VnYSBuZWdhdGlpdnNlaWQgdsOkw6RydHVzaS4gU2FnZWxpIG9uIGFnYSBuZWdhdGlpdnNlZCBtdXV0dWphIHbDpMOkcnR1c2VkIHbDtWltYXR1ZCAobsOkaXRla3MgbsOkZGFsYXMgc3VpdHNldGF0dWQgc2lnYXJldHRpZGUgYXJ2KS4gU2VlIG9uIG7DpGlkZSBoYWx2YXN0IG11ZGVsaXN0IQoKSnVodWwga3VpIHRlZ3UgbG9nbm9ybWFhbHNldGUgYW5kbWV0ZWdhIG9uIG1laWwgdsO1aW1hbHVzIGthc3V0YWRhIHBhbGp1IHBhcmVtYXQgbXVkZWxpdCB2YXJpZWVydXZ1c2VsZSAtIG11bHRpcGxpa2F0aWl2c2V0IHN0YW5kYXJkaMOkbHZldDoKCmBgYHtyIGVjaG89RkFMU0V9CgptdWx0aXBsaWNhdGl2ZV9zZCA8LSBmdW5jdGlvbih4KSB7CiAgeCA8LSBuYS5vbWl0KHgpCiAgYSA8LSBsb2cxMCh4KQogIGIgPC0gbWVhbihhKQogIGMgPC0gc2QoYSkKICBnZW9tX21lYW4gPC0gMTAqKmIKICBtdWx0X3NkIDwtIDEwKipjCiAgbG93ZXIxIDwtIGdlb21fbWVhbi9tdWx0X3NkCiAgdXBwZXIxIDwtIGdlb21fbWVhbiAqIG11bHRfc2QKICBsb3dlcjIgPC0gZ2VvbV9tZWFuLyhtdWx0X3NkKioyKQogIHVwcGVyMiA8LSBnZW9tX21lYW4gKiAobXVsdF9zZCoqMikKICBNZWFuIDwtIG1lYW4oeCkKICBsb3dlcjMgPC0gbWVhbih4KSAtIHNkKHgpCiAgdXBwZXIzIDwtIG1lYW4oeCkgKyBzZCh4KQogIGxvd2VyNCA8LSBtZWFuKHgpIC0gc2QoeCkqMgogIHVwcGVyNCA8LSBtZWFuKHgpICsgc2QoeCkqMgogIHJlc3VsdHMgPC0gdGliYmxlKFNEPWMoIm11bHRpcGxpY2F0aXZlX1NEIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGljYXRpdmVfMlNEIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkaXRpdmVfU0QiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRpdGl2ZV8yU0QiKSwgCiAgICAgICAgICAgICAgICAgICAgTUVBTj1jKGdlb21fbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuKSwgCiAgICAgICAgICAgICAgICAgICAgbG93ZXI9Yyhsb3dlcjEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyMywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcjQpLCAKICAgICAgICAgICAgICAgICAgICB1cHBlcj1jKHVwcGVyMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcjIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyNCkgKQogIHJlc3VsdHMKfQoKbXVsdGlwbGljYXRpdmVfc2QoYW5kbWVkKQpgYGAKClRhdmFsaXNlIGFyaXRtZWV0aXRpbGlzZSBrZXNrbWlzZSBhc2VtZWwgb24gbWVpbCBuw7zDvGQgZ2VvbWVldHJpbGluZSBrZXNrbWluZS4gIFbDtXJkbHVzZWtzIG9uIGFudHVkIGthIHRhdmFsaW5lIChhcml0bWVldGlsaW5lKSBrZXNrbWluZSBqYSAoYWRpdGlpdm5lKSBTRC4gQWRkaXRpaXZuZSBTRCBvbiBzZWxsZSBqYW90dXNlIGtpcmplbGRhbWlzZWtzIHNlbGdlbHQgZWJhYWRla3ZhYXRuZSAodnQgamFvdHVzZSBwaWx0aSDDvGxhbHBvb2wgamEgdsO1cmRsZSBtdWxpdHBsaWthdGlpdnNlIFNELWdhKS4KCgpLdWlkYXMgYWdhIHTDtsO2dGFiIG11bHRpcGxpa2F0aWl2bmUgc3RhbmRhcmRow6RsdmUgbm9ybWFhbGphb3R1c2VzdCBww6RyaXQgYW5kbWV0ZWdhPyBLdWkgbm9ybWFhbHNldGUgYW5kbWV0ZSBwZWFsIG11bHRpcGxpa2F0aWl2c2Ugc2QgcmFrZW5kYW1pbmUgdmlpYiBrYXRhc3Ryb29maW5pLCBzaWlzIHBvbGUgc2VsIHN0YXRpc3Rpa3VsIHN1dXJ0IHByYWt0aWxpc3Qga2FzdXR1c3J1dW1pLgpgYGB7cn0Kc2V0LnNlZWQoNTM2MykKbm9ybV9hbmRtZWQgPC0gcm5vcm0oMywgMTAwLCAyMCkKbXVsdGlwbGljYXRpdmVfc2Qobm9ybV9hbmRtZWQpCmBgYAoKTmFndSBuw6RoYSwgb24gbXVsdGlwbGlrYXRpaXZzZSBzZCBrYXN1dGFtaW5lIG5vcm1hYWxzZXRlIGFuZG1ldGVnYSDDvHNuYSBvaHV0dSAoa3VpZ2ksIGFpbnVsdCBuaWlrYXVhLCBrdW5pIG1laWwgcHV1ZHV2YWQgbmVnYXRpaXZzZWQgYW5kbWVkKS4gU2VlZ2EsIGt1aSBzYSBlaSBvbGUga2luZGVsLCBrYXMgdGVndSBvbiBub3JtYWFsamFvdHVzZWdhIHbDtWkgbG9nbm9ybWFhbGphb3R1c2VnYSwgYXJ2ZXN0YSwgZXQgbG9nbm9ybWFhbGphb3R1cyBvbiBiaW9sb29naWFzIMO8c25hIHRhdmFsaW5lIChlcml0aSBlbnPDvMO8bXJlYWt0c2lvb25pZGUgamEga2FzdnVwcm90c2Vzc2lkZSBqdXVyZXMpLiBTZWVnYSBvbiBtw7Vpc3RsaWsgYWxhdGkga2FzdXRhZGEgbXVsdGlwbGljYXRpdmVfc2QoKSBmdW5rdHNpb29uaSBqYSBrdWkgbcO1bGVtYSBTRCB2w6TDpHJ0dXNlZCBvbiBzYXJuYXNlZCwgc2lpcyB2w7VpYiBsb290YSwgZXQgYW5kbWVkIG9uIG5vcm1hYWxzZWQgbmluZyBzYWFiIGF2YWxkYWRhIHRhdmFww6RyYXNlIGFkZGl0aWl2c2UgU0QgcmVmZXJlZWRlIHLDtcO1bXVrcy4KCj4ga3VpIG4gPCAxMCwgc2lpcyBtw7VsZW1hZCBTRC1kIGFsYWhpbmRhdmFkIHRlaG5pbGlzdGVsIHDDtWhqdXN0ZWwgdGVnZWxpa2t1IHNkLWQuICBFdHRldmFhdHVzdCB2w6Rpa2VzdGUgdmFsaW1pdGVnYSEKCgojIyMjICgyKSBpc2Vsb29tdXN0YSBhbmRtZWlkIGFsZ3NlcyBza2FhbGFzOiBtZWRpYW4gKE1BRCkuIAoKTUFEIOKAky0tIG1lZGlhbiBhYnNvbHV0ZSBkZXZpYXRpb24gLS0tIG9uIHbDpGhlbSB0dW5kbGlrIG91dGxpZXJpdGUgc3VodGVzIGphIGVpIGVlbGRhIG5vcm1hYWxqYW90dXN0LiBQdXVkdXNla3Mgb24sIGV0IE1BRCBlaSBvbWEgdMO1bGdlbmR1c3QsIG1pbGxlIGtvaGFzZWx0IHRhIGjDtWxtYWtzIGtpbmRsYXQgcHJvdHNlbnRpIHBvcHVsYXRzaW9vbmkgdsO1aSB2YWxpbWkgYW5kbWVqYW90dXNlc3QuIFNlZXZhc3R1IHNkIHB1aHVsIHbDtWltZSBvbGxhIGtpbmRsYWQsIGV0IGlzZWdpIGvDtWlnZSBodWxsZW1hIGphb3R1c2Uga29ycmFsIGrDpMOkdmFkIHbDpGhlbWFsdCA3NSUgYW5kbWV0ZXN0IDIgU0QgcGlpcmlkZXNzZS4KCmBgYHtyfQptYWQoYW5kbWVkLCBjb25zdGFudCA9IDEpCmBgYAoKCgogICAgIMOEcmEga3VuYWdpIGF2YWxkYSBhbmRtZWlkIHZvcm1pczogbWVhbiAoTUFEKSB2w7VpIG1lZGlhbiAoU0QpLiAKICAgICBLb3JyZWt0bmUgdm9ybSBvbiBtZWFuKFNEKSB2w7VpIG1lZGlhbihNQUQpLgoKCgojIyMgMy4xLjMuIG11dXR1amF0ZSBrb29zLXZhcmllZXJ1dnVzCgpBbmRtZXRlIGtvb3MtdmFyaWVlcnV2dXN0IG3DtcO1ZGV0YWtzZSBrb3JyZWxhdHNpb29uaSBhYmlsLiBUdWxlbXVzZWtzIG9uIMO8a3MgbnVtYmVyIC0ga29ycmVsYXRzaW9vbmlrb3JkYWphIHIsIG1pcyB2YXJpZWVydWIgLTEgamEgMSB2YWhlbC4gCgogICAgciA9IDAg4oCTIGthaHRlIHTDvMO8cGkgbcO1w7V0bWlzZWQgKHg9cGlra3VzLCB5PWthYWwpIHNhbWFkZXN0IG3DtcO1dGVvYmpla3RpZGVzdCB2YXJpZWVydXZhZCDDvGtzdGVpc2VzdCBzw7VsdHVtYXR1bHQuIAogICAgciA9IDE6IGt1aSDDvGhlIG11dXR1amEgdsOkw6RydHVzIGthc3ZhYiwga2FzdmFiIGthIHRlaXNlIG11dXR1amEgdsOkw6RydHVzIGFsYXRpIHTDpHBzZWx0IHNhbWFzIHByb3BvcnRzaW9vbmlzLiAKICAgIHIgPSAtMToga3VpIMO8aGUgbXV1dHVqYSB2w6TDpHJ0dXMga2FzdmFiLCBrYWhhbmViIHRlaXNlIG11dXR1amEgdsOkw6RydHVzIGFsYXRpIHTDpHBzZWx0IHNhbWFzIHByb3BvcnRzaW9vbmlzLiAKICAgIApLdWkgciBvbiAtMSB2w7VpIDEsIHNhYW1lIG1lIHggdsOkw6RydHVzdCB0ZWFkZXMgdMOkcHNlbHQgZW5udXN0YWRhIHkgdsOkw6RydHVzZSAoamEgdmFzdHVwaWRpLCB0ZWFkZXMgeSB2w6TDpHJydXN0IHNhYW1lIHTDpHBzZWx0IGVubnVzdGFkYSB4IHbDpMOkcnR1c2UpLiAgICAKS3VpZGFzIHTDtWxnZW5kYW1lIGFnYSB0dWxlbXVzdCByID0gMC45PyBNaXR0ZSBrdWlkYWdpLiBTZWxsZSBhc2VtZWwgdMO1bGdlbmRhbWUgcjIgPSAwLjkqKjIgPSAwLjgxIOKAkyBtaXMgdMOkaGVuZGFiLCBldCB4LWkgdmFyaWVlcnV2dXMgc3V1ZGFiIHNlbGV0YWRhIDgxJSB5IHZhcmllZXJ1dnVzZXN0IGphIHZhc3R1cGlkaSwgZXQgWS1pIHZhcmllZXJ1dnVzIHN1dWRhYiBzZWxldGFkYSA4MSUgWC1pIHZhcmllZXJ1dnVzZXN0LiAKCmBgYHtyfQojY29ycmVsYXRpb248LWNvci50ZXN0KGlyaXMkU2VwYWwuTGVuZ3RoLCBpcmlzJFNlcGFsLldpZHRoLCBuYS5ybT1ULCBtZXRob2QgPSAicGVhcnNvbiIpICMgYSBsaXN0IG9mIDkKI25hbWVzKGNvcnJlbGF0aW9uKQojc3RyKGNvcnJlbGF0aW9uKQojY29ycmVsYXRpb24kY29uZi5pbnQKY29yKGlyaXMkU2VwYWwuTGVuZ3RoLCBpcmlzJFNlcGFsLldpZHRoLCB1c2U9ImNvbXBsZXRlLm9icyIpIApgYGAKCgpLb3JyZWxhdHNpb29uaWtvcmRhamEgdsOkw6RydHVzIHPDtWx0dWIgbWl0dGUgYWludWx0IGFuZG1ldGUga29vcy12YXJpZWVydXZ1c2VzdCB2YWlkIGthIGFuZG1ldGUgdWxhdHVzZXN0LiBTdXVyZW1hIHVsYXR1c2VnYSBhbmRtZWQgWCBqYS92w7VpIFkgdGVsamVsIGFubmF2YWQga2Vza2VsdGzDpGJpIDAtc3Qga2F1Z2VtYWwgb2xldmEga29ycmVsYXRzaW9vbmlrb3JkYWphLiBTZWxsZSBww6RyYXN0IHNvYmliIGtvcnJlbGF0c2lvb24gaGFsdmFzdGkgbsOkaXRla3Mga29yZHVza2F0c2V0ZSBrb29za8O1bGEgbcO1w7V0bWlzZWtzLiAKCkxpc2Frcywga29ycmVsYXRzaW9vbmlrb3JkYWphIG3DtcO1ZGFiIHZhaWQgYW5kbWV0ZSAqbGluZWFhcnNldCoga29vcy12YXJpZWVydXZ1c3Q6IGt1aSBhbmRtZWQga29vcy12YXJpZWVydXZhZCBtaXR0ZS1saW5lYWFyc2VsdCwgc2lpcyB2w7VpdmFkIGthIHbDpGdhIHR1Z2V2YWQga29vcy12YXJpZWVydXZ1c2VkIGrDpMOkZGEgbcOkcmthbWF0dWtzLgoKPiBLw7VpayBzdW1tYWFyc2VkIHN0YXRpc3Rpa3VkIGthb3RhdmFkIGVuYW11c2UgdGVpZSBhbmRtZXRlcyBsZWlkdXZhc3QgaW5mb3N0IOKAkyBzZWUga2FvdHVzIG9uIMO1aWd1c3RhdHVkIGFpbnVsdCBzaWlzLCBrdWkgdGVpZSBwb29sdCB2YWxpdHVkIHN0YXRpc3RpayBpc2Vsb29tdXN0YWIgaMOkc3RpIGFuZG1ldGUgc8O8Z2F2YW1hdCBvbGVtdXN0IChuw6RpdGVrcyB0w7zDvHBpbGlzdCBtw7XDtXRtaXN0dWxlbXVzdCB2w7VpIGFuZG1ldGUgdmFyaWVlcnV2dXN0KS4KCgpgYGB7ciBldmFsPUZBTFNFfQojS3VpZGFzIGFydnV0YWRhIGNvcnJlbGF0c2lvb25pbWFhdHJpa3NpdCBrb29zIGFkanVzdGVlcml0dWQgcCB2w6TDpHJ0dXN0ZWdhCiNudW1lcmljIGNvbHVtbnMgb25seSEKcHJpbnQocHN5Y2g6OmNvcnIudGVzdChpcmlzWy01XSwgdXNlPSJjb21wbGV0ZSIpLCBzaG9ydCA9IEZBTFNFKQpgYGAKCiAgCiMjIDMuMiBFREEgLS0tIGVrc3Bsb3JhdG9vcm5lIGFuZG1lYW5hbMO8w7xzCgpLdWkgw7xoZW51bWJyaWxpbmUgYW5kbWV0ZSBzdW1tZWVyaW1pbmUgdMOkaWRhYiBlZWxrw7VpZ2Uga29ra3V2w7V0bGlrdSBrb21tdW5pa2F0c2lvb25pIGVlc23DpHJraSwgc2lpcyBFREEgb24gc3V1bmF0dWQgdGVhZGxhc2VsZSBlbmRhbGUuIEVEQSBlZXNtw6RyayBvbiBhbmRtZWlkIGVlbGvDtWlnZSBncmFhZmlsaXNlbHQgdmFhZGF0YSwgZXQgc2FhZGEgYWltdSAxKSBhbmRtZXRlIGt2YWxpdGVlZGlzdCBqYSAyKSBsYXN0YSBhbmRtZXRlbCAic2VsbGlzZW5hIG5hZ3UgbmFkIG9uIiBrw7VuZWxlZGEgamEgc3VnZXJlZXJpZGEgdXVkc2VpZCB0ZWFkdXNsaWtrZSBow7xwb3RlZXNlLiBOZWlkIGjDvHBvdGVlc2UgcGVha3Mgc2lpcyB0ZXN0aW1hIGZvcm1hYWxzZSBzdGF0aXN0aWxpc2UgYW5hbMO8w7xzaSBhYmlsLgoKPiBFREE6IG1pZGEgcm9oa2VtIGdyYWFmaWt1aWQsIHNlZGEgcm9oa2VtIHbDtWltYWx1c2kgdXV0ZSBtw7V0ZXRlIHRla2tla3MhCgpLw7VpZ2VwZWFsdCB2YWF0YW1lIGFuZG1laWQgbnVtYnJpbGlzZSBrb2trdXbDtXR0ZW5hOgpgYGB7cn0KcHN5Y2g6OmRlc2NyaWJlKGlyaXMpCgpgYGAKCk1pbGxpc2VkIGtvcnJlbGF0c2lvb25pZCB2w7Vpa3NpZCBhbmRtZXRlcyBlc2luZWRhPwpgYGB7cn0KbGlicmFyeShjb3JyZ3JhbSkgI1BDQSBmb3Igb3JkZXJpbmcKCmNvcnJncmFtKGlyaXMsIG9yZGVyPVRSVUUsIAogICAgICAgICBsb3dlci5wYW5lbCA9IHBhbmVsLnB0cywKICAgICAgICAgdXBwZXIucGFuZWwgPSBwYW5lbC5lbGxpcHNlLAogICAgICAgICBkaWFnLnBhbmVsID0gcGFuZWwuZGVuc2l0eSwKICAgICAgICAgbWFpbj0iQ29ycmVsb2dyYW0gb2YgSXJpcyBkYXRhc2V0IikKYGBgCgojIyMgMy4yLjEuIEt1aWRhcyB1dXJpZGEgbXV1dHVqYSBzaXNlc3QgdmFyaWVlcnV2dXN0CgpNdXV0dWphIC0gbWlkYWdpLCBtaWRhIG3DtcO1ZGV0aSAobsOkaXRla3MgbcO1w7V0ZW9iamVrdGlkZSBrYWFsKS4gCkt1aSBpZ2EgbXV1dHVqYSBrb2h0YSBvbiB2YWlkIMO8a3MgbnVtYmVyLCBtaWRhIHBsb3R0aWRhLCBrYXN1dGEgQ2xldmVsYW5kIHBsb3R0aToKCmBgYHtyfQpkZCA8LSBkaWFtb25kcyAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShudW1iZXJfb2ZfZGlhbW9uZHM9bigpKQpkZCAlPiUgZ2dwbG90KGFlcyh4PW51bWJlcl9vZl9kaWFtb25kcywgCiAgICAgICAgICAgICAgICAgIHk9cmVvcmRlcihjbGFyaXR5LCBudW1iZXJfb2ZfZGlhbW9uZHMpKSkgKwogIGdlb21fcG9pbnQoc2l6ZT0zKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3VyPSJncmV5NjAiLCBsaW5ldHlwZT0iZGFzaGVkIikpICsKICBsYWJzKHk9ImNsYXJpdHkiKQpgYGAKCiMjIyMgMy4yLjIuIFBsb3RpIHZhbGlrIHPDtWx0dWIgdmFsaW1pIHN1dXJ1c2VzdC4KCjEpIE4gPCAyMCAtIHBsb3RpIGlnYSBhbmRtZXB1bmt0IGVyYWxkaSAoc3RyaXBjaGFydCgpLCBwbG90KCkpIGphIGtlc2ttaW5lIHbDtWkgbWVkaWFhbi4gCgoyKSAyMCA+IE4gPiAxMDA6IGdlb21fZG90cGxvdCgpIGhpc3RvZ3JhbW1pIHZhYXRlcwoKMykgTiA+IDEwMDogZ2VvbV9oaXN0b2dyYW0oKSwgZ2VvbV9kZW5zaXR5KCkgLS0tIG5lbmRlIGFiaWwgc2FhYiBrYSAyIGt1bmkgNiBqYW90dXN0IHbDtXJyZWxkYQoKNCkgTWl0bWUgamFvdHVzZSBrw7VydnV0aSB2YWF0YW1pc2VrcyBrdWkgTiA+IDE1OiBnZW9tX2JveHBsb3QoKSBvciwgd2hlbiBOID4gNTAsIGdlb21fdmlvbGluKCksIGdlb21fam95KCkgCgogCgpgYGB7cn0KVG9vdGhHcm93dGggPC0gVG9vdGhHcm93dGgKVG9vdGhHcm93dGgkZG9zZSA8LSBhcy5mYWN0b3IoVG9vdGhHcm93dGgkZG9zZSkKcDwtZ2dwbG90KFRvb3RoR3Jvd3RoLCBhZXMoeD1kb3NlLCB5PWxlbikpICsgCiAgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKcAojIENoYW5nZSBkb3RzaXplIGFuZCBzdGFjayByYXRpbywgYWRkIGxpbmUgb3IgZG90IGZvciBtZWRpYW4KZ2dwbG90KFRvb3RoR3Jvd3RoLCBhZXMoeD1kb3NlLCB5PWxlbikpICsgCiAgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJywKICAgICAgICAgICAgICAgc3RhY2tyYXRpbz0xLjUsIGRvdHNpemU9MC43KSsKICBzdGF0X3N1bW1hcnkoZnVuLnkgPSBtZWRpYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDk1LCAKICAgICAgICAgICAgICAgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDE1KSArCiAgdGhlbWVfdHVmdGUoKQoKcCArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWRpYW4sIGdlb209InBvaW50Iiwgc2hhcGU9MTgsCiAgICAgICAgICAgICAgICAgc2l6ZT01LCBjb2xvcj0icmVkIikKCiNhZGQgbWVhbiBhbmQgU0QsIHVzZSBwb2ludHJhbmdlCnAgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIiwgY29sb3I9InJlZCIpCiN1c2UgZXJyb3JiYXJzCnAgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICBnZW9tPSJlcnJvcmJhciIsIGNvbG9yPSJyZWQiLCB3aWR0aD0wLjIpICsKICBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgZ2VvbT0icG9pbnQiLCBzaXplPTMsIGNvbG9yPSJyZWQiKQpgYGAKCk5paSBzYWFiIHBsb3R0aWRhIG11bHRpcGxpa2F0aWl2c2Ugc2Q6CmBgYHtyfQojIEZ1bmN0aW9uIHRvIHByb2R1Y2Ugc3VtbWFyeSBzdGF0aXN0aWNzIChnZW9tZXRyaWMgbWVhbiBhbmQgbXVsdGlww7xsaWNhdGl2ZSBzZCkKbXVsdGlfc2QgPC0gZnVuY3Rpb24oeCkgewogIHggPC0gbmEub21pdCh4KQogIGEgPC0gbG9nMTAoeCkKICBiIDwtIG1lYW4oYSkKICBjIDwtIHNkKGEpCiAgZ19tZWFuIDwtIDEwKipiCiAgbXNkIDwtIDEwKipjCiAgeW1pbiA8LSBnX21lYW4vbXNkCiAgeW1heCA8LSBnX21lYW4gKiBtc2QKIHJldHVybihjKHkgPSBnX21lYW4sIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCkpIAp9CnAgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9bXVsdGlfc2QsIGNvbG9yPSJibHVlIiwgc2l6ZT0xLjEpICsgdGhlbWVfdHVmdGUoKQpgYGAKCmBgYHtyfQojIENoYW5nZSBkb3QgcGxvdCBjb2xvcnMgYnkgZ3JvdXBzCnA8LWdncGxvdChUb290aEdyb3d0aCwgYWVzKHg9ZG9zZSwgeT1sZW4sIGZpbGw9ZG9zZSkpICsKICBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpwCmBgYAoKSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjaGFuZ2UgbWFudWFsbHkgZG90IHBsb3QgY29sb3JzIHVzaW5nIHRoZSBmdW5jdGlvbnMgOgoKc2NhbGVfZmlsbF9tYW51YWwoKSA6IHRvIHVzZSBjdXN0b20gY29sb3JzCgpzY2FsZV9maWxsX2JyZXdlcigpIDogdG8gdXNlIGNvbG9yIHBhbGV0dGVzIGZyb20gUkNvbG9yQnJld2VyIHBhY2thZ2UKCnNjYWxlX2ZpbGxfZ3JleSgpIDogdG8gdXNlIGdyZXkgY29sb3IgcGFsZXR0ZXMKCgpgYGB7cn0KI0Nob29zZSB3aGljaCBpdGVtcyB0byBkaXNwbGF5IDoKcCArIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPWMoIjAuNSIsICIyIikpCmBgYAoKCgpEb3RwbG90IGt1aSBoaXN0b2dyYW06CmBgYHtyfQpnZ3Bsb3QoaXJpcywgYWVzKFNlcGFsLkxlbmd0aCkpICsgZ2VvbV9kb3RwbG90KCkKYGBgCgpIaXN0b2dyYW06CgpgYGB7cn0KZ2dwbG90KGlyaXMsIGFlcyhTZXBhbC5MZW5ndGgpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCwgY29sb3I9IndoaXRlIiwgZmlsbCA9ICJuYXZ5Ymx1ZSIpIApgYGAKCmBgYHtyfQpsaWJyYXJ5KGdndGhlbWVzKQpkIDwtIGlyaXMgICAgICAgICMgRnVsbCBkYXRhIHNldApkX2JnIDwtIGRbLCAtNV0gICMgQmFja2dyb3VuZCBEYXRhIC0gZnVsbCB3aXRob3V0IHRoZSA1dGggY29sdW1uIChTcGVjaWVzKQoKZ2dwbG90KGRhdGEgPSBkLCBhZXMoeCA9IFNlcGFsLldpZHRoLCBmaWxsID0gU3BlY2llcykpICsKICBnZW9tX2hpc3RvZ3JhbShkYXRhID0gZF9iZywgZmlsbCA9ICJncmV5IiwgYWxwaGE9MC44LCBiaW5zPTEwKSArCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3VyID0gImJsYWNrIiwgYmlucz0xMCkgKwogIGZhY2V0X2dyaWQoU3BlY2llc34uKSArCiAgZ3VpZGVzKGZpbGwgPSBGQUxTRSkgKyAgIyB0byByZW1vdmUgdGhlIGxlZ2VuZAogIHRoZW1lX3R1ZnRlKCkgICAgICAgICAgIyBmb3IgY2xlYW4gbG9vayBvdmVyYWxsCgpgYGAKCmRlbnNpdHkgcGxvdDoKYGBge3J9CmlyaXMlPiVnZ3Bsb3QoKSsKICBnZW9tX2RlbnNpdHkoYWVzKFNlcGFsLldpZHRoLCBmaWxsPVNwZWNpZXMsIGNvbG9yPVNwZWNpZXMsIGFscGhhPTAuNSkpKwogIHRoZW1lX3R1ZnRlKCkKCmBgYAoKam95cGxvdCB2w7VpbWFsZGFiIGvDtXJ2dXRpIHBhbm5hIGlzZWdpIHNhZHUgZGVuc2l0eSBwbG90dGUKCmBgYHtyfQpsaWJyYXJ5KGdnam95KQpnZ3Bsb3QoaXJpcywgYWVzKHg9U2VwYWwuTGVuZ3RoLCB5PVNwZWNpZXMsIGZpbGw9U3BlY2llcykpICsgCiAgZ2VvbV9qb3koc2NhbGU9NCwgcmVsX21pbl9oZWlnaHQ9MC4wMSwgYWxwaGE9MC45KSArCiAgdGhlbWVfam95KGZvbnRfc2l6ZSA9IDEzLCBncmlkPVRSVUUpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCkJveHBsb3Q6CmBgYHtyfQpnZ3Bsb3QoaXJpcywgYWVzKFNwZWNpZXMsIFNlcGFsLldpZHRoLCBmaWxsPVNwZWNpZXMpKSArIGdlb21fYm94cGxvdCgpCmBgYAoKdmlvbGluIHBsb3QgcGx1cyBqaXR0ZXJwbG90OgpgYGB7cn0KZ2dwbG90KGlyaXMsIGFlcyhTcGVjaWVzLCBTZXBhbC5XaWR0aCkpICsgCiAgZ2VvbV92aW9saW4oYWVzKGZpbGw9U3BlY2llcykpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMSwgYWxwaGE9MC40LCBzaXplPTAuNSkKYGBgCgoKIyMjIDMuMi4zLiBLYWhlIG11dXR1amEga29vcy12YXJpZWVydXZ1cyAKCmBgYHtyfQogIApnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzLCBhZXMoeCA9IGRlcHRoLCB5ID0gcHJpY2UpKSArCiAgZ2VvbV9wb2ludChzaXplPTAuMSwgYWxwaGE9MC4xKSArCiAgZ2VvbV9kZW5zaXR5MmQoKQpgYGAKCgpGaXQgYSBsaW5lYXIgbW9kZWwgYW5kIHBsb3QgdGhlIGRvdHMgYW5kIG1vZGVsOgpgYGB7cn0KZ2dwbG90KGRhdGE9aXJpcywgYWVzKFNlcGFsLldpZHRoLCBQZXRhbC5XaWR0aCkpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgY29sb3I9InJlZCIpIApgYGAKCgoKIyMjIDMuMy4gS29ra3V2w7V0ZToKCmEuCUFuZG1lcHVua3RpZGUgcGxvdHRpbWluZSBzw6RpbGl0YWIgbWFrc2ltYWFsc2VsdCBhbmRtZXRlcyBvbGV2YXQgaW5mb3QgKG5paSBrYXN1bGlra3UgaW5mb3Qga3VpIG3DvHJhKS4gQWl0YWIgbGVpZGEgb3V0bGllcmVpZCAodmFsZXN0aSBzaXNlc3RhdHVkIGFuZG1laWQsIHZhbGVzdGkgbcO1w7VkZXR1ZCBwcm9vdmUgam1zKS4gS3VpIHZhbGltIG9uIHbDpGlrc2VtIGt1aSAyMCwgcGlpc2FiIHTDpGllc3RpIMO8a3Npa3V0ZSBhbmRtZXB1bmt0aWRlIHBsb3Rpc3Qga29vcyBtZWRpYWFuaWdhLiBEb3QtcGxvdCBydXVsaWIuCgpiLglIaXN0b2dyYW1tIOKAkyBrw7VpZ2VwZWFsdCBtw7XDtXRza2FhbGEgamEgc2VlasOkcmVsIGFuZG1lZCBqYWdhdGFrc2UgdsO1cmRzZSBsYWl1c2VnYSBiaW5uaWRlc3NlIGphIHBsb3RpdGFrc2UgYmlubmlkZSBrw7VyZ3VzZWQuIEJpbiwga3VodSBsw6RrcyAyMCBhbmRtZXB1bmt0aSBvbiAyWCBrw7VyZ2VtIGt1aSBiaW4sIGt1aHUgbMOka3MgMTAgYW5kbWVwdW5rdGkuIFNhbWFzLCBiaW5pIGxhaXVzL3VsYXR1cyBtw7XDtXRlc2thYWxhbCBwb2xlIHRlaWxlIGV0dGUgYW50dWQg4oCTIGphIHNlbGxlc3QgdsO1aWIgc8O1bHR1ZGEgaGlzdG9ncmFtbWkga3VqdS4gU2VlZ2Egb24gc29vdml0YXYgcHJvb3ZpZGEgZXJpbmV2YWlkIGJpbmkgbGFpdXNpIGphIHbDtXJyZWxkYSBzYWFkdWQgaGlzdG9ncmFtbWUuIEhpc3RvZ3JhbW0gc2lzYWxkYWIgdsOkaGVtIGluZm90IGt1aSBkb3QgcGxvdCwgYWdhIHbDtWltYWxkYWIgcGFyZW1pbmkgdGFiYWRhIHNlYWR1c3DDpHJhc2lkICYgYW5kbWVqYW90dXN0ICYgb3V0bGllcmVpZCBzdXVydGUgYW5kbWVrb2d1c3RlIGtvcnJhbC4KCmMuIERlbnNpdHkgcGxvdC4gU2lsdXR1ZCB2ZXJzaW9vbiBoaXN0b2dyYW1taXN0LCBtaXMga2FvdGFiIGluZm90IGFnYSB0b29iIHZhaGVzdCB2w6RsamEgc2lnbmFhbGkgbcO8cmEgYXJ2ZWwuIERlbnNpdHkgcGxvdHRlIG9uIGhlYSBrw7VydnV0aSB2YWFkZWxkYSBqb3kgcGxvdGkgYWJpbC4KCmQuCUJveC1wbG90IOKAkyBzaXNhbGRhYiB2w6RoZW0gaW5mb3Qga3VpIGhpc3RvZ3JhbW0sIGt1aWQgbmVpZCBvbiBsaWh0c2FtIGvDtXJ2dXRpIHbDtXJyZWxkYS4gTGV2aW51aW0gdmFyaWFudCAoa3VpZCBrYWhqdWtzIG1pdHRlIGFpbnVzKSBvbiBUdWtleSBib3gtcGxvdCDigJMgbWVkaWFhbiAoam9vbiksIDUwJSBJUVIgKGJveCkgamEgMSw1eCBJUVIgKHZ1bnRzaWQpLCBwbHVzcyBvdXRsaWVyaWQgZXJhbGRpIHB1bmt0aWRlbmEuCgplLglWaW9saW4gcGxvdCDigJMgaW5mb3JtYXRpaXZzdXNlbHQgYm94LXBsb3RpIGphIGhpc3RvZ3JhbW1pIHZhaGVwZWFsIOKAkyBzb2JpYiBwYWxqdWRlIGphb3R1c3RlIGvDtXJ2dXRpIHbDtXJkbGVtaXNla3MKCmYuCUxpbmUgcGxvdCDigJMga2FzdXRhIGFpbnVsdCBzaWlzIGt1aSBuaWkgWCBrdWkgWSB0ZWxqZWxlIG9uIGthbnR1ZCBwaWRldiB2w6TDpHJ0dXMgKHBpa2t1cywga2FhbCwga29udHNlbnRyYXRzaW9vbiwgYWVnIGptcykuIMOEcmEga2FzdXRhLCBrdWkgdGVsamVsZSBrYW50dWQgcHVua3RpZGUgdmFoZWwgZWkgb2xlIGxvb2R1c2VzIG3DtXRldCBvbWF2YWlkIHBpZGV2YWlkIHbDpMOkcnR1c2kgKG7DpGl0ZWtzIFggdGVsamVsIG9uIGthdHNlIGphIGtvbnRyb2xsIHbDtWkgZXJpbmV2YWQgdmFsZ3VtdXRhdHNpb29uaWQsIG1pbGxlIGFrdGlpdnN1c3Qgb24gbcO1w7VkZXR1ZCkKCmcuCVN1aGV0ZSB2w7VyZGxlbWluZSAocGllIHZzIGJhcikKCmguCUNsZXZlbGFuZCBwbG90IGNvdW50aWRlIGphb2tzLiBLYXN1dGEgQmFycGxvdHRpIGFpbnVsdCBzaWlzLCBrdWkgQ2xldmVsYW5kIHBsb3Qgdm0gcGxvdCBtaW5naWwgcMO1aGp1c2VsIGVpIHNvYmkuIEJhcnBsb3QgdsO1aWtzIG9sbGEgdmlpbWFuZSB2YWxpay4KCj4gSW5mb3JtYXRzaW9vbmkgaHVsayBrYWhhbmV2YWx0OiAKaWdhIGFuZG1lcHVua3QgcGxvdGl0dWQgKGRvdCBwbG90KSAtPiAKaGlzdG9ncmFtIC0+IApkZW5zaXR5IHBsb3QvdmlvbGluIHBsb3QgLT4gCmJveCBwbG90IC0+IApiYXIgcGxvdCBzdGFuZGFyZGjDpGx2ZXRlZ2EgLT4gCkNsZXZlbGFuZCBwbG90IChiYXJwbG90IGlsbWEgdmVhcGlpcmlkZXRhKSAKCiMjI0rDpHRhIG1lZWxkZToKCjEuIHN0YXRpc3Rpa2EgdXVyaWIgZm9ybWFhbHNlaWQgbXVkZWxlaWQsIG1pdHRlIHRlb29yaWFpZCBlZ2EgcMOkcmlzIG1hYWlsbWEuCgoyLiBTdGF0aXN0aWthIGphZ2F0YWtzZSBrYWh0ZSBvc3NhOiBraXJqZWxkYXYgamEgasOkcmVsZGF2IChpbmZlcmVudGlhbCkuIAoKMy4gS2lyamVsZGF2IHN0YXRpc3Rpa2Ega2lyamVsZGFiIHRlaWUgYW5kbWVpZCBzdW1tYWFyc2V0ZSBzdGF0aXN0aWt1dGUgbmluZyBncmFhZmlsaXN0ZSBtZWV0b2RpdGUgYWJpbC4gCgo0LiBKw6RyZWxkYXYgc3RhdGlzdGlrYSBww7zDvGFiIHRlaWUgYW5kbWV0ZSBww7VoamFsIHRlaGEgasOkcmVsZHVzaSBzdGF0aXN0aWxpc2UgcG9wdWxhdHNpb29uaSBrb2h0YSwgbWlsbGVzdCBuZWVkIGFuZG1lZCBww6RyaW5ldmFkCgo1LiBTdGF0aXN0aWthIHDDtWhpbGluZSDDvGxlc2FubmUgb24ga3ZhbnRpZml0c2VlcmlkYSBlYmFraW5kbHVzdCwgbWlzIMO8bWJyaXRzZWIgbmVpZCBqw6RyZWxkdXNpLgoKIyMgMy40LiBTw7VuYXN0aWsKCiogU3RhdGlzdGlsaW5lIHBvcHVsYXRzaW9vbiDigJMgb2JqZWt0aWRlIGtvZ3VtLCBtaWxsZWxlIHNvb3ZpbWUgdGVoYSBzdGF0aXN0aWxpc3Qgw7xsZGlzdHVzdC4gTsOkaXRla3MgaGlubmF0YSBrZXNrbWlzdCByYXZpbWkgbcO1anUgcGF0c2llbmRpcG9wdWxhdHNpb29uaXMuIFbDtWkgRXNjaGVyaWNoaWEgY29saSBlbnPDvMO8bWkgWCBrZXNrbWlzdCBLY2F0LWkuIAoKKiBWYWxpbSDigJMgbmVlZCBvYmpla3RpZCAocGF0c2llbmRpZCwgZW5zw7zDvG1pcHJlcGlkKSwgbWlkYSBtZSByZWFhbHNlbHQgbcO1w7VkYW1lLiAKCiogSnVodXZhbGltIOKAkyB2YWxpbSwgbWlsbGUgbGlpa21lZCBvbiBwb3B1bGF0c2lvb25pc3QgdmFsaXR1ZCBqdWh1c2xpa3VsdCBqYSBpc2VzZWlzdmFsdC4gU2VlIHTDpGhlbmRhYiwgZXQga8O1aWdpbCBwb3B1bGF0c2lvb25pIGxpaWttZXRlbCAoa8O1aWtpZGVsIHBhdHNpZW50aWRlbCB2w7VpIGvDtWlraWRlbCB2w7VpbWFsaWtlbCBlbnPDvMO8bWlwcmVwYXJhdHNpb29uaWRlbCkgb24gdsO1cmRuZSB2w7VpbWFsdXMgc2F0dHVkYSB2YWxpbWlzc2UgSkEsIGV0IHZhbGltaXNzZSBqdWJhIHNhdHR1bnVkIGxpaWttZSh0ZSkgcMO1aGphbCBlaSBvbGUgdsO1aW1hbGlrIGVubnVzdGFkYSBqw6RyZ21pc2VuYSB2YWxpbWlzc2Ugc2F0dHV2YXQgbGlpZ2V0LiAKCiogRXNpbmR1c2xpayB2YWxpbSDigJMgVmFsaW0gb24gZXNpbmR1c2xpaywga3VpIHRhIHBlZWdlbGRhYiBow6RzdGkgc3RhdGlzdGlsaXN0IHBvcHVsYXRzaW9vbmkuIEthIGp1aHV2YWxpbSBlaSBwcnV1Z2kgb2xsYSBlc2luZHVzbGlrIChqdWh1c2xpa3VsdCkuCgoqIFN0YXRpc3RpayDigJMgbWlkYWdpLCBtaXMgb24gdMOkcHNlbHQgYXJ2dXRhdHVkIHZhbGltaSBww7VoamFsIChuw6RpdGVrcyBwaWtrdXN0ZSBrZXNrbWluZSkKCiogUGFyYW1lZXRyaSB2w6TDpHJ0dXMg4oCTIHRlYWRtYXRhIHN1dXJ1cywgbWlsbGUgdMOkcHNldCB2w6TDpHJ0dXN0IG1lIHNhYW1lIGFpbnVsdCB1bWJrYXVkdSBlbm51c3RhZGEgYWdhIG1pdHRlIGt1bmFnaSB0w6Rwc2VsdCB0ZWFkYS4gKG7DpGl0ZWtzIG11ZGVsaSBpbnRlcmNlcHQsIHBvcHVsYXRzaW9vbmkga2Vza21pbmUgcGlra3VzOyBlZmVrdGkgc3V1cnVzID0ga2F0c2VncnVwaSBrZXNrbWluZSDigJMga29udHJvbGxncnVwaSBrZXNrbWluZSkKCiogU3RhdGlzdGlsaW5lIG11ZGVsIOKAkyBtYXRlbWFhdGlsaW5lIGZvcm1hbGlzZWVyaW5nLCBtaXMgc2FnZWxpIGtvb3NuZWIgMnN0IG9zYXN0OiBkZXRlcm1pbmlzbWxpayBwcm90c2Vzc2ktbXVkZWwgcGx1c3MganVodXNsaWsgdmVhL3ZhcmllZXJ1dnVzZS1tdWRlbC4gClByb3RzZXNzaS1tdWRlbGkgbsOkaXRla3Mga3VqdXRsZSwgZXQgbcO1w7VkYWQgbWl0bWUgaW5pbWVzZSBwaWtrdXN0IChYIG11dXR1amEpIGphIGthYWx1IChZIG11dXR1amEpLiBTaXJnZSB2w7VycmFuZGlnYSBZID0gYSArIGIgKiBYIChrYWFsID0gYSArIGIgKiBwaWtrdXMpIHNhYWIgYW5kYSBkZXRlcm1pbmlzbWxpa3UgbGluZWFhcnNlIGVubnVzdHVzZSBrYWFsdSBrb2h0YToga3VpIFggKHBpa2t1cykgbXV1dHViIMO8aGUgw7xoaWt1IChjbSkgdsO1cnJhLCBzaWlzIG11dXR1YiBZIChrYWFsKSB2w6TDpHJ0dXMga2Vza21pc2VsdCBiIMO8aGlrdSAoa2cpIHbDtXJyYS4gU2VldmFzdHUgdmFyaWVlcnV2dXNlLW11ZGVsIG9uIHTDtWVuw6Rvc3VzamFvdHVzIChuw6RpdCBub3JtYWFsamFvdHVzKS4gU2VsbGUgYWJpbCBtb2RlbGxlZXJpdGFrc2UgWS1zdXVuYWxpc3QgYW5kbWV0ZSB2YXJpZWVydXZ1c3QgaWdhbCBYIHbDpMOkcnR1c2VsIChuw6RpdGVrcywgbWlsbGluZSBvbiAxODIgY20gcGlra3VzdGUgaW5pbWVzdGUgb29kYXRhdiBrYWFsdWphb3R1cykuICBNdWRlbCBvbiBzZWVnYSB0w7VlbsOkb3N1c2xpazogbWUgc2FhbWUgbsOkaXRla3Mga8O8c2lkYTogbWlsbGlzZSB0w7VlbsOkb3N1c2VnYSBrYWFsdWIgMTgyIGNtIHBpa2t1bmUgaW5pbWVuZSDDvGxlIDEwMCBraWxvLiBNaWRhIGxhaWVtIG9uIHZhcmllZXJ1dnVzZSBtdWRlbGkgWS1pIHN1dW5hbGluZSBqYW90dXMgaWdhbCBYLWkgdsOkw6RydHVzZWwsIHNlZGEga2VodmVtaW5pIGVubnVzdGFiIG11ZGVsLCBtaWxsaXN0IFkgdsOkw6RydHVzdCB2w7VpbWUga29ua3JlZXRzZWx0IG9vZGF0YSBtaW5naSBYLWkgdsOkw6RydHVzZSBrb3JyYWwuIExpbmVhYXJzZXRlIG11ZGVsaXRlIGVlc23DpHJrIGVpIG9sZSBzaWlza2kgbWl0dGUgbmlpdsO1cmQgdXV0ZSBhbmRtZXRlIGVubnVzdGFtaW5lIChzZWRhIHRlZXZhZCBwYXJlbWluaSBrZWVydWxpc2VkIG11ZGVsaWQpLCB2YWlkIG11ZGVsaSBzdHJ1a3R1dXJpc3QgbMOkaHR1dmFsdCBww7VoanVzbGlrZSBow7xwb3RlZXNpZGUgcMO8c3RpdGFtaW5lL2tvbnRyb2xsaW1pbmUgKGthcyBpbmltZXNlIHBpa2t1cyB2w7Vpa3Mgb3RzZXNlbHQgcmVndWxlZXJpZGEva29udHJvbGxpZGEgdGVtYSBrYWFsdT8pLiBLdW5hIHNlbGxpbmUgdmlpcyB0ZWFkdXN0IHRlaGEgdMO2w7Z0YWIgw7xrc25lcyBsaWh0c2F0ZSBtdWRlbGl0ZSBrb3JyYWwsIG9uIGVuYW1rYXN1dGF0dWQgc3RhdGlzdGlsaXNlZCBtdWRlbGlkIHRhb3RsdXNsaWt1bHQgbGlodHN1c3RhdmFkIGphIGVpIHByZXRlbmRlZXJpIHTDtWVsw6RoZWR1c2VsZS4gCgoqIFRlaG5pbGluZSByZXBsaWthdHNpb29uIOKAkyBzYW1hIHByb292aSAocGF0c2llbnRpLCBlbnPDvMO8bWlwcmVwYXJhdHNpb29uaSwgaGlpcmUgcGVzYWtvbm5hIGxpaWdldCkgbcO1w7VkZXRha3NlIG1pdHUga29yZGEuIE3DtcO1ZGFiIHRlaG5pbGlzdCB2YXJpZWVydXZ1c3QgZWhrIG3DtcO1dG1pc3ZpZ2EuIFNlZGEgcMO8w7xhbWUga29udHJvbGxpZGEgcGFyYW5kYWRlcyBtw7XDtXRtaXNhcGFyYXR1dXJpL3Byb3Rva29sbGUgdsO1aSBzaWlzIGp1YmEgYW5kbWV0ZSB0YXNlbWVsLCBzdGF0aXN0aWxpc2UgYW5hbMO8w7xzaWdhLiBOw6RpdGVrcyBzYWFtZSBhbmRtZWlkIGFncmVnZWVyaWRhIGphIGFydnV0YWRhIGtlc2t2w6TDpHJ0dXNlLiBLdWkgYW5kbWVwdW5rdGUgb24gcGlpc2F2YWx0IGphIHZhcmllZXJ1dnVzIG9uIHPDvG1tZWV0cmlsaW5lIMO8bWJlciB0w7VlbGlzZSBwb3B1bGF0c2lvb25pdsOkw6RydHVzZSwgc2lpcyBhbm5hYiBrZWtzdsOkw6RydHVzIG1laWxlIGhlYSBoaW5uYW5ndSBwYXJhbWVldHJpIHTDtWVsaXNlbGUgdsOkw6RydHVzZWxlLgoKKiBCaW9sb29naWxpbmUgcmVwbGlrYXRzaW9vbiDigJMgZXJpbmV2YWlkIHBhdHNpZW50ZSwgZW5zw7zDvG1pcHJlcHBlLCBlcmluZXZhdGUgaGlpcmVwZXNha29uZGFkZSBsaWlrbWVpZCBtw7XDtWRldGFrc2UsIGlnYcO8aHQgw7xrcyBrb3JkLiBFZXNtw6RyayBvbiBtw7XDtXRhIEJpb2xvb2dpbGlzdCB2YXJpZWVydXZ1c3QsIG1pcyB0dWxlbmViIG3DtcO1dGVvYmpla3RpZGUgcmVhYWxzZXRlc3QgZXJpbmV2dXN0ZXN0OiBpZ2EgcGF0c2llbnQgamEgaWdhIGVuc8O8w7xtaW1vbGVrdWwgb24gZXJpbmV2IGvDtWlnaXN0IHRlaXN0ZXN0IG9tYXN1Z3VzdGVzdC4gQmlvbG9vZ2lsaW5lIHZhcmllZXJ1dnVzIG9uIHRlYWR1c2xpa3VsdCBodXZpdGF2IGphIHNlZGEgc2FhYiB2aXN1YWxpc2VlcmlkYSBhbGdhbmRtZXRlIHRhc2VtZWwgKG1pdHRlIGtlc2t2w6TDpHJ0dXNlIHRhc2VtZWwpIG7DpGl0ZWtzIGhpc3RvZ3JhbW1pbmEuClRlYWR1c2xpa2tlIGrDpHJlbGR1c2kgdGVoYWtzZSBiaW9sb29naWxpc3RlIHJlcGxpa2FhdGlkZSBww7VoamFsLiBUZWhuaWxpc2VkIHJlcGxpa2FhZGlkIHNlZXZhc3R1IGthbGlicmVlcml2YWQgbcO1w7V0ZXPDvHN0ZWVtaSB0w6Rwc3VzdC4gS3VpIHRlIHV1cml0ZSBzb29sZWtlcGlrZXN0IEUuIGNvbGksIGVpIHNhYSB0ZSB0ZWhhIGZvcm1hYWxzZXQgasOkcmVsZHVzdCBrw7VpZ2kgYmFrdGVyaXRlIGtvaHRhLiBTYW1hbW9vZGksIGt1aSB0ZSB1dXJpdGUgdmFpZCDDvGhlIGhpaXJlcGVzYWtvbm5hL3B1dXJpIGxpaWttZWlkLCBlaSBzYWEgdGUgdGVoYSBqw6RyZWxkdXNpIGvDtWlraWRlIGhpaXJ0ZSBrb2h0YS4gS3VpIHRlaWUga2F0c2Vza2VlbSBzaXNhbGRhYiBuaWkgdGVobmlsaXNpIGt1aSBiaW9sb29naWxpc2kgcmVwbGlrYWF0ZSBvbiBsaWh0c2FpbSB2aWlzIG5laWQgYW5kbWVpZCBhbmFsw7zDvHNpZGEga8O1aWdlcGVhbHQga2Vza21pc3RhZGEgw7xsZSB0ZWhuaWxpc3RlIHJlcGxpa2FhdGlkZSBuaW5nIHNlZWrDpHJlbCBrYXN1dGFkYSBzYWFkdWQga2Vza21pc2kgZWRhc2lzdGVzIGFydnV0dXN0ZXMgw7xsZSBiaW9sb29naWxpc3RlIHJlcGxpa2FhdGlkZSAobsOkaXRla3MgYXJ2dXRhZGEgbmVuZGUgcGVhbHQgdXVlIGtlc2ttaXNlLCBzdGFuZGFyZGjDpGx2ZSBqYS92w7VpIHVzYWxkdXNpbnRlcnZhbGxpKS4gU2VsbGluZSBrYWhlLWV0YXBpbGluZSBhcnZ1dHVza8OkaWsgZWkgb2xlIHNpaXNraSBvcHRpbWFhbG5lLiBPcHRpbWFhbG5lLCBrdWlkIGtlZXJ1a2FtLCBvbiBwYW5uYSBtw7VsZW1hdCB0w7zDvHBpIGFuZG1lZCDDvGh0ZSBoaWVyYXJoaWxpc3NlIG11ZGVsaXNzZS4KCiMjIyNUw7VlbsOkb3N1c2UgKFApIHJlZWdsaWQgb24gw7xoaXNlZCBrb2d1IHN0YXRpc3Rpa2FsZTogCiogUCBqw6TDpGIgMCBqYSAxIHZhaGVsZTsgUChBKSA9IDEgdMOkaGVuZGFiLCBldCBzw7xuZG11cyBBIHRvaW11YiBraW5kbGFzdGkuIAoqIGt1aSBzw7xuZG11c2VkIEEgamEgQiBvbiDDvGtzdGVpc3QgdsOkbGlzdGF2YWQsIHNpaXMgdMO1ZW7DpG9zdXMsIGV0IHRvaW11YiBzw7xuZG11cyBBIHbDtWkgc8O8bmRtdXMgQiBvbiBuZW5kZSBrYWhlIHPDvG5kbXVzZSB0w7VlbsOkb3N1c3RlIHN1bW1hIC0tLSBQKEEgdiBCKSA9IFAoQSkgKyBQKEIpLgoqIEt1aSBBIGphIEIgZWkgb2xlIMO8a3N0ZWlzdCB2w6RsaXN0YXZhZCwgc2lpcyBQKEEgdiBCKSA9IFAoQSkgKyBQKEIpIOKAkyBQKEEgJiBCKS4KKiBrdWkgQSBqYSBCIG9uIMO8a3N0ZWlzZXN0IHPDtWx0dW1hdHVkIChBIHRvaW11bWlzZSBqw6RyZ2kgZWkgc2FhIGVubnVzdGFkYSBCIHRvaW11bWlzdCBqYSB2YXN0dXBpZGkpIHNpaXMgdMO1ZW7DpG9zdXMsIGV0IHRvaW11dmFkIG3DtWxlbWFkIHPDvG5kbXVzZWQgb24gbmVuZGUgc8O8bmRtdXN0ZSB0w7VlbsOkb3N1c3RlIGtvcnJ1dGlzIOKAky0tIFAoQSAmIEIpID0gUChBKSB4IFAoQikuIAoqIEt1aSBCIG9uIGxvb2dpbGlzZWx0IEEgYWxhbW9zYSwgc2lpcyBQKEIpIDwgUChBKQoqIFAoQSB8IEIpIOKAky0tIHRpbmdsaWsgdMO1ZW7DpG9zdXMuIFPDvG5kbXVzZSBBIHTDtWVuw6Rvc3VzLCBqdWh1bCBrdWkgcGVha3MgdG9pbXVtYSBzw7xuZG11cyBCLiBQKHZpaG0gfCBwaWx2ZXMgaWxtKSBlaSBvbGUgc2FtYSwgbWlzIFAocGlsdmVzIGlsbSB8IHZpaG0pLgoqIEp1aHVsIGt1aSBQKEIpPjAsIHNpaXMgUChBIHwgQikgPSBQKEEgJiBCKS9QKEIpIGVoawoqIFAoQSB8IEIpID0gUChBKSB4IFAoQiB8IEEpL1AoQikg4oCTLS0gQmF5ZXNpIHRlb3JlZW0uCgpLdWlnaSBrw7VpayBzdGF0aXN0aWt1ZCBsw6RodHV2YWQgdMO1ZW7DpG9zdXN0ZWdhIHTDtsO2dGFtaXNlbCB0w6Rwc2VsdCBzYW1hZGVzdCBtYXRlbWFhdGlsaXN0ZXN0IHJlZWdsaXRlc3QsIHTDtWxnZW5kYXZhZCBlcmluZXZhZCBrb29sa29ubmFkIHNhYWR1ZCBudW1icmVpZCBlcmluZXZhbHQuIEtha3MgcMO1aGlsaXN0IGtvb2xrb25kYSBvbiBzYWdlZHVzbGlrdWQgc3RhdGlzdGlrdWQgamEgQmF5ZXNpYWFuaWQuIAoKKiBUw7VlbsOkb3N1cywgc2FnZWR1c2xpayB0w7VsZ2VuZHVzIOKAkyBwaWthYWphbGluZSBzw7xuZG11c3RlIHN1aHRlbGluZSBzYWdlZHVzLiBOw6RpdGVrcyA2LXRlIHNhZ2VkdXMgcGFsanVkZWwgdMOkcmluZ3V2aXNldGVsLiBTYWdlZHVzbGlrIHTDtWVuw6Rvc3VzIG9uIHRlYXR1ZCB0w7zDvHBpIGFuZG1ldGUgc2FnZWR1cywgdGluZ2ltdXNlbCBldCBudWxsaMO8cG90ZWVzIChIMCkga2VodGliOyBlaGsgUChhbmRtZWQgfCBIMCkuIE51bGxow7xwb3RlZXMgw7x0bGViIGVuYW1hc3RpLCBldCB1dXJpdGF2YSBwYXJhbWVldHJpIChuw6RpdGVrcyByYXZpbWllZmVrdGkgc3V1cnVzKSB2w6TDpHJ0dXMgb24gbnVsbC4gU2VlZ2EsIGt1aSBQIG9uIHbDpGlrZSwgZWkgb2xlIHNlZGEgdMO8w7xwaSBhbmRtZWQga29vc2vDtWxhcyBhcnZhbXVzZWdhLCBldCBwYXJhbWVldHJpIHbDpMOkcnR1cyBvbiBudWxsIChtaXMgYWdhIGVpIHTDpGhlbmRhIGF1dG9tYWF0c2VsdCwgZXQgc2EgcGVha3NpZCB1c2t1bWEsIGV0IHBhcmFtZWV0cmkgdsOkw6RydHVzIGVpIG9sZSBudWxsKS4gCgoqIFTDtWVuw6Rvc3VzLCBCYXllc2kgdMO1bGdlbmR1cyDigJMgdXN1IG3DpMOkciBtaW5naXNzZSBow7xwb3RlZXNpLiBOw6RpdGVrcyA2MiUgdMO1ZW7DpG9zdXMgKGV0IHBvcHVsYXRzaW9vbmkga2Vza21pbmUgcGlra3VzIDwgMTgwIGNtKSB0w6RoZW5kYWIsIGV0IHNhIG9sZWQgcmF0c2lvbmFhbHNlIG9sZW5kaW5hIG7DtXVzIGt1bHV0YW1hIG1pdHRlIHJvaGtlbSBrdWkgNjIgc2VudGkga2lobHZlbyBwZWFsZSwgbWlzIHbDtWlkdSBrb3JyYWwgdG9vYiBzdWxsZSBzaXNzZSAxIEVVUiAoamEgMzggc2VudGkga2FzdW1pdCkuIEJheWVzaSB0w7VlbsOkb3N1cyBvbWlzdGF0YWtzZSBzdGF0aXN0aWxpc2VsZSBow7xwb3RlZXNpbGUgKG7DpGl0ZWtzLCBldCByYXZpbWllZmVrdGkgc3V1cnVzIGrDpMOkYiB2YWhlbWlra3UgYSBrdW5pIGIpLCB0aW5naW11c2VsLCBldCBzdWwgb24gdMOkcHNlbHQgbmVlZCBhbmRtZWQsIG1pcyBzdWwgb247IGVoayBQKGjDvHBvdGVlcyB8IGFuZG1lZCkuIAoKCgoKCg==